Search code examples
androiddropbox

Read a file from dropbox


In my Dropbox file-system, there is a file 'check.txt' that contains a value (0/1) which I have to check every 5 minutes.
The access to Dropbox is successful but the reading of this file is not always right.
At first the file contains 0 and the first reading returns the correct value (0). Then if I manually change the value in 1 into the file, the next reading will return again the value 0 and the correct value is returned after many readings.
I use the Dropbox Synch and my android version is 4.3

This is a part of code:

public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);

    try {       
        DbxAccountManager AcctMgr = DbxAccountManager.getInstance(getApplicationContext(), DropboxActivity.appKey, DropboxActivity.appSecret);          
        DbxFileSystem dbxFs = DbxFileSystem.forAccount(AcctMgr.getLinkedAccount());

        DbxFile file = dbxFs.open(DropboxActivity.path);

        DbxFileStatus status = file.getSyncStatus();
        if (!status.isCached) {
            file.addListener(new DbxFile.Listener() {
                @Override
                public void onFileChange(DbxFile file) {
                    try {
                        if (file.getSyncStatus().isCached) {
                          file.update();
                          // deal with the new value
                          Log.e("TAG", "*** VALUE *** " + file.readString());
                        }
                    } catch (DbxException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
        }

        if((file.readString()).equals("0")) { 
            Log.d("TAG", "Value: " + file.readString());    

        }
        else { 
            Log.d("TAG", "Value: " + file.readString());
            flag = 1;

            stopAlarm();                
            startService(new Intent(this, GpsService.class));

        }

        file.close();

    } catch(Exception e) {
        e.printStackTrace();
    }



    stopSelf();

    return startId;
}

How ca I use file.getNewerStatus() and file.update() or other methods to correctly update the cache files?

Edit:


Solution

  • You're on the right track. You need to hold the file open for the Sync API to download new content, and then you need to listen for changes, so be sure to not close it. See https://www.dropbox.com/developers/sync/start/android#listeners. Something like this:

    DbxFileStatus status = testFile.getSyncStatus();
    if (!status.isCached) {
        testFile.addListener(new DbxFile.Listener() {
            @Override
            public void onFileChange(DbxFile file) {
                if (file.getSyncStatus().isCached) {
                  file.update();
                  // deal with the new value
                }
            }
        });
    }
    

    Once you do this, there's no need to check the file every five seconds... you'll get a notification every time it changes.

    (Also, you might want to look into the Datastore API instead.)