【问题标题】:How to convert a string to a URI without throwing exceptions如何在不抛出异常的情况下将字符串转换为 URI
【发布时间】:2020-11-05 02:35:50
【问题描述】:

我必须将 Uri 转换为字符串,以便我可以序列化该 Uri。

Intent openFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
openFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
openFileIntent.setType("audio/mpeg");
startActivityForResult(openFileIntent, PICK_MP3_FILE);

...然后是活动结果...

public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_MP3_FILE)
        {
            if (resultCode == RESULT_OK)
            {
                try
                {
                    if (data != null)
                    {
                        Uri mp3AudioFile;
                        if ((mp3AudioFile = data.getData()) != null)
                        {
                            myObject.setMp3Path(mp3AudioFile.getPath());
                            myObject.Save();

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

我关闭了应用程序并再次打开。当我尝试使用以下命令打开该 Uri 时:

Uri uri = Uri.parse(myObject.getMp3Path();

我收到一个错误:

java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider uri content://com.android.providers.downloads.documents/document/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Faudio.mp3 from pid=601, uid=10107 requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs

我的清单具有以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

【问题讨论】:

    标签: java android android-permissions android-file android-fileprovider


    【解决方案1】:

    我们需要提供持久的 Uri 权限。


    JAVA

     Intent openFileIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
     openFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
     openFileIntent.setType("audio/mpeg");
     startActivityForResult(openFileIntent, PICK_MP3_FILE);
    

    还有一个值得一提的注意事项,持久权限仅适用于 Intent.ACTION_OPEN_DOCUMENT Intent.ACTION_GET_DOCUMENT,而后者则类似一次性。

    【讨论】:

    • @blackapps 他的问题不在于字符串或 URL 生成。这是访问网址的权限。
    • 您应该花时间在下面编辑您自己的答案。只是说。 p.s.我没有对你投反对票。
    • We need to provide persistent Uri permission. 因为你不能在这里提供任何东西,你可能的意思是:We need to receive persistent Uri permission in onActivityResult.
    • 顺便说一句,这个问题刚刚回来。如果我保存文件名并重新启动手机,我将失去对该文件的权限。有人可以帮忙吗?有没有办法永久授予对下载或其他文件夹中 mp3 文件的访问权限?
    • 没关系,我只是想出了问题所在。我必须使用 takePersistableUriPermission() 和 Intent.FLAG_GRANT_READ_URI_PERMISSION 来保持许可。它实际上在文档中,但我不确定我是否在做正确的过程。任何读到这篇文章并希望通过重启来保持权限的人都不要忘记使用 takePersistableUriPersmission()!!
    【解决方案2】:

    为此,我使用了 getPath()。

    你应该使用 toString() 代替。

     String scheme = uri.toString();
    
     Uri uri = Uri.parse(scheme);
    

    【讨论】:

    • 我确实使用了 toString。抱歉,我已经编辑了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2015-05-01
    • 2015-11-19
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多