如何使用原生Android文件打开对话框?

25

我在一些应用程序中看到了这个在安卓上选择/打开文件的对话框,它看起来像是原生的。但我找不到在自己的应用程序中使用它的方法。附加截图的语言是德语,但我相信有人会认出它。 文件对话框的截图

3个回答

61

您可以使用意图 ACTION_GET_CONTENT 并配合 MIME 类型 */*

它将在 onActivityResult() 中返回URI。

@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
        }
    }

屏幕截图


3
这种方法更好,因为它还允许访问Dropbox等应用中的文件。使用 ACTION_OPEN_DOCUMENT 时,Dropbox 不会显示在列表中。 - bartolja
当我在KITKAT上使用set_type("image/*")时,它不会带我到这个对话框,而是弹出一个用于打开的应用程序列表。 - Tjaart
我对这个对话框不满意,我想用它来打开一个ZIP文件,就像:ZipFile z=new ZipFile(file);这是不可能的... - neoexpert
嗨,我有同样的问题,但我使用Unity3dsC#语言。是否可能使用C#代码在游戏中打开本地文件对话框? - abdol-hamid Hosseiny

9
那似乎是存储访问框架的系统UI。你可以使用ACTION_OPEN_DOCUMENT允许用户打开现有文档,或者使用ACTION_CREATE_DOCUMENT允许用户创建新文档。
然而,这不是一个文件 UI,它是一个内容 UI。用户可以浏览未本地存储的东西-在截图中,用户可以浏览他们的Google Drive和OneDrive区域。你得到的是指向内容的Uri,而不是文件路径

1
是的,这正是我所寻找的!非常感谢!只是不知道这被称为内容,但它绝对有意义... - bartolja

0

请查看Android开发者文档和文件文档。 在Kotlin中,您可以像这样启动文件打开对话框

/**
 * 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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接