【问题标题】:Unsupported Uri in ContentResolver when passing Uri returned by Intent传递 Intent 返回的 Uri 时 ContentResolver 中的 Uri 不受支持
【发布时间】:2019-01-12 17:10:51
【问题描述】:

我有一个应用程序,用户可以通过选择一个文件或将所选目录中的所有文件添加到ListView 来添加音乐文件。添加单个文件时,一切都很好,但对于目录我得到Unsupported Uri。问题与权限无关:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.dibo.testapp, PID: 12226
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65579, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/tree/raw:/storage/emulated/0/Download/2006 A Good Year flg=0xc3 }} to activity {com.example.dibo.testapp/com.example.dibo.testapp.MainActivity}: java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2F2006%20A%20Good%20Year
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4360)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2F2006%20A%20Good%20Year
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
        at android.content.ContentResolver.query(ContentResolver.java:802)
        at android.content.ContentResolver.query(ContentResolver.java:752)
        at android.content.ContentResolver.query(ContentResolver.java:710)
        at com.example.dibo.testapp.PlaylistFragment.addFolder(PlaylistFragment.java:380)
        at com.example.dibo.testapp.PlaylistFragment.onActivityResult(PlaylistFragment.java:346)
        at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:160)
        at com.example.dibo.testapp.MainActivity.onActivityResult(MainActivity.java:152)
        at android.app.Activity.dispatchActivityResult(Activity.java:7454)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)

这是意图请求:*

private void selectDirectory() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);

    startActivityForResult(intent, REQUEST_FOLDER);
}

结果处理程序:

@Override
public void onActivityResult(int requestCode, int resultCode,
                             Intent resultData) {

    if (requestCode == REQUEST_FILE && resultCode == Activity.RESULT_OK) {
        if (resultData != null) {
            addFile(resultData.getData());
        }
    }

    if (requestCode == REQUEST_FOLDER && resultCode == Activity.RESULT_OK) {

        if (resultData != null) {
            addFolder(resultData.getData());
        }
    }
}

private void addFolder(Uri uri) {

    ContentResolver contentResolver = getActivity().getContentResolver();

    if (contentResolver==null) {
        return;
    }

    Cursor cursor = contentResolver.query(
            uri, // Uri
            null,
            null,
            null,
            null
    );

    if (cursor != null &&  cursor.moveToFirst()) {
        int Title = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);

        do {

            String SongTitle = cursor.getString(Title);
            Log.d("addFolder", SongTitle);

        } while (cursor.moveToNext());
    }

    if (cursor != null) {
        cursor.close();
    }

}

contentResolver.query 中引发异常。请注意,所有内容都在 Fragment 类中,而不是在 Activity 中。

【问题讨论】:

  • 您是否尝试过使用名称中没有空格的文件夹?
  • @Blundell 嘿,感谢您的回复!我不认为这是问题所在,因为即使他从文件夹名称中删除了空格,一些特殊字符,如 %2F/ 路径分隔符)仍然会出现在目录字符串中。
  • @Enzo:不需要任意的Uri 来支持MediaStore.Audio.Media.TITLE。如果您想要文档 Uri 的显示名称,请使用 DocumentFile
  • @CommonsWare 我明白你的意思,但我认为这也不是问题所在,因为当他尝试获取 MediaStore.Audio.Media.TITLE 列时不会发生错误,而是在创建Cursor,在contentResolver.query。这很奇怪,因为 Google 有 a page with an example similar to the OP's one,但无论如何,感谢您的帮助!
  • OP 仍应尝试这些方法以尽量减少 Space Enzo 的问题。另一个奇怪的是/:raw/ 文件夹,奇怪的前缀。我看到他们正在尝试使用模拟器,这是模拟器唯一的问题吗?

标签: java android android-intent android-contentresolver


【解决方案1】:

你需要先做魔法:

Uri docUriTree = DocumentsContract.buildDocumentUriUsingTree(treeUri, DocumentsContract.getTreeDocumentId(treeUri));

然后您可以从 Uri 中读取 DocumentsContract.Document 值。

【讨论】:

  • 你好,这个函数有什么用?为什么文档树选择器中返回的Uri 不够?
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多