【问题标题】:Android: Need Download folder Uri instead of pathAndroid:需要下载文件夹 Uri 而不是路径
【发布时间】:2020-06-17 23:22:05
【问题描述】:

我和我的第一个 Android 应用程序似乎完全迷失在 Uri、路径和 Android 文件系统结构的迷宫中。 :-

我的应用程序允许用户将数据导出到文件中。我创建了一个目录选择器,它允许用户选择一个文件夹并将字符串转换后的 uri 存储在首选项中,如下所示:

        case R.id.action_directoryPicker: {
            Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
            i.addCategory(Intent.CATEGORY_DEFAULT);
            startActivityForResult(Intent.createChooser(i, "Choose directory"), 9999);
            return true;
        }

    ....

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 9999) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

        Uri treeUri = data.getData();
        if (treeUri == null) {
            return;
        }
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(SettingsActivity.KEY_PREF_IMPORT_EXPORT_LOCATION, treeUri.toString());
        editor.apply();
    }
}

这很好用! 现在,我想在第一次启动应用程序时将默认设置为下载文件夹,这是出现问题的时候。 我在 mainActivity.onCreate() 中有以下代码

        # Now some conversion madness: 
        # Convert environment string into a file
        # Convert file into a uri 
        # Convert uri into a string again so I can store it in preferences
        File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
        Uri u = Uri.fromFile(f);  
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(SettingsActivity.KEY_PREF_IMPORT_EXPORT_LOCATION, u.toString());
        editor.apply();
    }

尽管它很丑,但它在原则上是有效的。但是,我从 Environment.DIRECTORY_DOWNLOADS 获得的字符串/uri 与通过 filePicker 例程手动选择下载文件夹时获得的不同。

应该阅读的内容:content://com.android.providers.downloads.documents/tree/downloads

我从Environment.DIRECTORY_DOWNLOADS 得到的结果失败了:file:///storage/emulated/0/Download

因此,在所有这些上下文之后,我的问题是获得反映设备下载文件夹的正确 Uri 的最佳方法是什么?

【问题讨论】:

标签: android path environment-variables uri


【解决方案1】:

你可以这样获取uri

File newFile = new File(filePath);
Uri contentUri = getUriForFile(context, "com.packagename.www", newFile);

【讨论】:

  • 谢谢!需要更详细地研究这一点,现在似乎 getUriForFile 可靠地使应用程序崩溃。可能是因为 Environment.DIRECTORY_DOWNLOADS 实际上不是文件,而是文件夹。
【解决方案2】:

不可能。

您应该让用户使用您的选择器选择文件夹。

您确实可以自己为下载文件夹构建 uri,但即使您这样做也没有意义,因为您没有使用它的权限。

【讨论】:

  • 这是我的后备选项,在第一次启动时清空路径并要求用户在尝试运行第一个文件导出时使用文件选择器。我对 Android 上所有这些文件处理的复杂程度感到震惊。
  • 荒谬的系统
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2017-04-29
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多