cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Announcements
What’s new: end-to-end encryption, Replay and Dash updates. Find out more about these updates, new features and more here.

Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Re: Android ACTION_GET_CONTENT from Dropbox sources

Android ACTION_GET_CONTENT from Dropbox sources

Andhie W.
New member | Level 1

Device OS: Lollipop 5.0

When using the Intent ACTION_GET_CONTENT and selecting Dropbox from the Storage Provider, Dropbox prompts a file picker dialog to choose from. The result obtained in onActivityResult is something like

file:///storage/emulated/0/Android/data/com.dropbox.android/files/u6763728/scratch/Camera%20Uploads/2012-04-02%2012.34.44.jpg

The requesting app will not have read permission as its dropbox own private directory even with WRITE_EXTERNAL_STORAGE permission. In KitKat, it is recommended to use FileProvider to share a file via a content:// uri

26 Replies 26

Greg-DB
Dropbox Staff

Thanks for the report! I'm sending this along to the right people.

Michael G.89
New member | Level 1

Any update on this? I've run into the same issue.

Greg-DB
Dropbox Staff

Apologies, no update right now. I'll check in with the right people again.

Craig M.21
New member | Level 2

Has this been fixed recently? I did not run in to permission issues using the following code to initiate download...

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

intent.setType("*/*");

startActivityForResult(intent, PICKFILE_RESULT_CODE );    

The uri returned in onActivityResult was this:

file:///storage/emulated/0/Android/data/com.dropbox.android/files/scratch/Kanji%20Sketch%20Pad/KanjiKnowledge.ks

Processing the data in onActivityResult required a bit of a workaround for Dropbox, which I'll mention in a separate thread, but my app read the file okay. Does the issue only appear under certain circumstances?

Craig M.21
New member | Level 2

I should add, I am using Android 5.0.2, device is HTCOne,

Greg-DB
Dropbox Staff

Still no news on potentially using content:// instead yet, but I'll ask engineering if something changed about the existing behavior/any guidance.

Greg-DB
Dropbox Staff

Thanks for your patience Craig. I heard back from engineering here with the following information:

  • FLAG_GRANT_READ_URI_PERMISSION seems to have no effect.
  • On Android API level 18 (and presumably probably below), specifying READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE does not matter. The calling app is able to read the file irrespective of these settings.
  • On Android API level 19 and above, the calling app needs the READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE permission to be able to read the data provided by us.

Also, on Android API level 19 and above caller will need to read the data using the ContentResolver#openInputStream(fileUri) method to be able to read the files. While on API level 18 and below directly creating the file object to read the file works.

Craig M.21
New member | Level 2

Thanks for that. I have not had any problems with reading the file. I am therefore unsure what the problem was that the other posters met.

 

I have read and write permissions set.

 

I initially used code like this (based on suggestions found online):

 

ParcelFileDescriptor mInputPFD = null ;
           try {
                mInputPFD = getContentResolver().openFileDescriptor(returnUri, "r");
           } catch (FileNotFoundException e) {
                e.printStackTrace();
                System.out.println("File not found...");
                return;
           }
if(mInputPFD!=null){
    fd = mInputPFD.getFileDescriptor();           
     FileInputStream fis = new FileInputStream(fd);
    //process the input stream
}

 

I tried the more direct method suggested above and it also worked:

 

FileInputStream fis = null ;
    try {
            fis = (FileInputStream) getContentResolver().openInputStream(returnUri);
    }
    catch (FileNotFoundException e1) {
             e1.printStackTrace();
             System.out.println("File not found...");            
             return ;
    }

 //process the input stream

 

I am using targeted Android API 19.

 

Can I assume that the ContentResolver#openInputStream(fileUri) method will also work on API 18 and lower?

Greg-DB
Dropbox Staff

openInputStream was added in API level 1 and is documented to support both content and file schemes, so it looks like it should work.

Need more support?