I've seen this dialog to pick/open a file on android in some apps and it seems to me as the native one. But I can't find a way to use it in my own apps. The language of the attached screenshot is German, but I'm sure someone will recognize it. Screenshot of the file-dialog
            Asked
            
        
        
            Active
            
        
            Viewed 3.0k times
        
    3 Answers
61
            You can use the intent ACTION_GET_CONTENT with the MIME type */*. 
It will return the URI in onActivityResult()
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent()
        .setType("*/*")
        .setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select a file"), 123);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 123 && resultCode == RESULT_OK) {
            Uri selectedfile = data.getData(); //The uri with the location of the file
        }
    }
        Johnny Five
        
- 987
 - 1
 - 14
 - 29
 
        Jordan Junior
        
- 1,090
 - 10
 - 11
 
- 
                    3Yeah, this way is even better, because it also allows access to files in apps like Dropbox. Dropbox is not shown in the list when **ACTION_OPEN_DOCUMENT** is used. – bartolja Apr 11 '16 at 20:24
 - 
                    When I do this with `set_type("image/*")` on KITKAT, it does not take me to this dialog, but instead a list of apps to be used for opening pops up. – Tjaart Dec 18 '17 at 06:48
 - 
                    I am not satisfied with this dialog, I would like to open a ZIP file with it like: ZipFile z=new ZipFile(file); this is not possible... – neoexpert Feb 22 '19 at 11:09
 - 
                    hi, i have same problem but i use ***Unity3ds*** `C#`.is possible open native file Dialog in game with c# code? – abdol-hamid Hosseiny Aug 26 '19 at 08:17
 
9
            
            
        That appears to be the system UI for the Storage Access Framework. You would use ACTION_OPEN_DOCUMENT to allow the user to open an existing document, or ACTION_CREATE_DOCUMENT to allow the user to create a new document.
However, this is not a file UI. It is a content UI. The user can browse things that are not locally stored — in the screenshot, the user can browse their Google Drive and One Drive areas. And, what you get is a Uri pointing to content, not a file path.
        CommonsWare
        
- 986,068
 - 189
 - 2,389
 - 2,491
 
- 
                    1Yes, that's exactly what I've searched for! Thanks so much! Just didn't know that this is called content, but it absolutely makes sense... – bartolja Apr 11 '16 at 19:58
 
0
            
            
        See Android developer documents and files documentations. In Kotlin you can launch file open dialog like that:
/**
 * Starts bookmarks import workflow by showing file selection dialog.
 */
private fun showImportBookmarksDialog() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_OPENABLE)
    type = "*/*" // That's needed for some reason, crashes otherwise
      putExtra(
        // List all file types you want the user to be able to select
        Intent.EXTRA_MIME_TYPES, arrayOf(
            "text/html", // .html
            "text/plain" // .txt
        )
    )
}
bookmarkImportFilePicker.launch(intent)
// See bookmarkImportFilePicker declaration below for result handler
}
// Assuming you have context access as a fragment or an activity
val bookmarkImportFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        result: ActivityResult ->
    if (result.resultCode == Activity.RESULT_OK) {
        // Using content resolver to get an input stream from selected URI
        // See:  https://commonsware.com/blog/2016/03/15/how-consume-content-uri.html
        result.data?.data?.let{ uri ->
            context?.contentResolver?.openInputStream(uri).let { inputStream ->
                val mimeType = context?.contentResolver?.getType(uri)
                // TODO: do your stuff like check the MIME type and read from that input stream
        }
    }
}
        Slion
        
- 2,558
 - 2
 - 23
 - 27
 
