android - Android 10 - 将 documentUri 转换为 mediaStoreUri 会引发错误
问题描述
任何人都可以回答为什么我在尝试从 documentUri 获取 mediaUri 时遇到此异常。我想用 mediaUri 查询 contentResolver 以从外部存储中获取所有音频文件
Uri mediaUri = MediaStore.getMediaUri(mContext,docUri);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult Result erreicht " + requestCode);
if (requestCode != PICK_AUDIO_REQUEST || resultCode != RESULT_OK) {
Log.d(TAG, "no selection");
return;
}
mUri = data.getData();
getContentResolver().takePersistableUriPermission(mUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(mUri,
DocumentsContract.getTreeDocumentId(mUri));
docUri = DocumentsContract.buildDocumentUriUsingTree(mUri,
DocumentsContract.getTreeDocumentId(mUri));
Uri mediaUri = MediaStore.getMediaUri(mContext, docUri);
}
mUri: content://com.android.providers.downloads.documents/tree/downloads
docUri: content://com.android.providers.downloads.documents/tree/downloads/document/downloads
堆栈跟踪:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.cl.languagetranslation.testandroid10, PID: 29419
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/tree/downloads flg=0xc3 }} to activity {com.cl.languagetranslation.testandroid10/com.cl.languagetranslation.testandroid10.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getPath()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4845)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getPath()' on a null object reference
at android.os.Parcel.createException(Parcel.java:2077)
at android.os.Parcel.readException(Parcel.java:2039)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:658)
at android.content.ContentProviderClient.call(ContentProviderClient.java:558)
at android.content.ContentProviderClient.call(ContentProviderClient.java:546)
at android.provider.MediaStore.getMediaUri(MediaStore.java:3501)
at com.cl.languagetranslation.testandroid10.MainActivity.onActivityResult(MainActivity.java:121)
at android.app.Activity.dispatchActivityResult(Activity.java:8110)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4838)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
感谢您的帮助!从存储中获取音频文件确实是一项艰巨的工作......还有其他人也在苦苦挣扎......所以,我并不孤单试图这样做......
GGK
解决方案
getMediaUri() 允许具有存储访问框架权限的应用程序在引用相同底层项目的 MediaStore 和 DocumentsProvider Uris 之间进行转换。请注意,此方法不会授予任何新权限;调用者必须已经拥有使用 Intent#ACTION_OPEN_DOCUMENT 或相关 API 获得的权限。
推荐阅读
- c# - 在 IEnumerator 协程中使用闭包的说明
- c# - exe.config 没有正确更新
- swift - WKWebView 进入后台时停止调用 Javascript
- c++ - 如果我在 C++ 中有一个字符数组,它是如何工作的?
- vue.js - Vue Apollo instance option issues, can't configure properly
- python - 如何在没有令牌或访问控制的情况下从 userId(pk) 获取 Instagram 用户个人资料详细信息?
- excel - 从 A 列 Excel 数组公式中查找 C 列中最接近的值
- python - 仅打开和读取目录内的目录文件
- c++ - Openssl 二进制文件没有 lib 文件或包含 Qt 的头文件
- jquery - 通过模态传递 data-id 到 jQuery 验证