我正在尝试在设备下载文件夹中创建我的应用程序的目录。我正在尝试使用存储访问框架在运行在 android q 或更高版本上的设备中创建目录。代码在大多数设备中运行良好,我能够创建目录并将文件存储在其中。但是在某些设备中我遇到了错误。
这是意图:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, CREATE_FOLDER);
这是我收到错误的 onActivityResult() :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case CREATE_FOLDER:
Uri currentUri = null;
if (resultCode == RESULT_OK && data != null) {
Uri currentUri = data.getData();
if(currentUri==null){
Toast.makeText(this,
"Device does not support saf",
Toast.LENGTH_SHORT).show();
return; }
else{
final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(currentUri,takeFlags);
DocumentFile parentDocumentFile = DocumentFile.fromTreeUri(this, currentUri);
DocumentFile childDocumentFile = parentDocumentFile.createDirectory(getResources().getString(R.string.app_name));
}
}
// saving uri of folder created for future use
SharedPreferences.Editor folderUri = getSharedPreferences("folderUri", 0).edit();
folderUri.putString("folderUri",currentUri.toString());
folderUri.apply();
}
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
我在 android manifest 中添加了读/写权限,并且还要求用户许可。我已经询问了一些用户的设备应用程序崩溃并且他们已授予所有权限。所以,我不确定问题是什么以及为什么它只在少数设备上发生。
以下是其中一次崩溃的堆栈跟踪:
java.lang.RuntimeException:
at android.app.ActivityThread.deliverResults (ActivityThread.java:5096)
at android.app.ActivityThread.handleSendResult (ActivityThread.java:5137)
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:2146)
at android.os.Handler.dispatchMessage (Handler.java:107)
at android.os.Looper.loop (Looper.java:237)
at android.app.ActivityThread.main (ActivityThread.java:7770)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1047)
Caused by: java.lang.SecurityException:
at android.os.Parcel.createException (Parcel.java:2088)
at android.os.Parcel.readException (Parcel.java:2056)
at android.os.Parcel.readException (Parcel.java:2004)
at android.app.IUriGrantsManager$Stub$Proxy.takePersistableUriPermission (IUriGrantsManager.java:280)
at android.content.ContentResolver.takePersistableUriPermission (ContentResolver.java:2435)
at package.SomeActivity.somemethod (SomeActivity.java:1340)
at package.SomeActivity.onRequestPermissionsResult (SomeActivity.java:1206)
at android.app.Activity.dispatchRequestPermissionsResult (Activity.java:8500)
at android.app.Activity.dispatchActivityResult (Activity.java:8322)
at android.app.ActivityThread.deliverResults (ActivityThread.java:5089)
at android.app.ActivityThread.handleSendResult (ActivityThread.java:5137)
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:2146)
at android.os.Handler.dispatchMessage (Handler.java:107)
at android.os.Looper.loop (Looper.java:237)
at android.app.ActivityThread.main (ActivityThread.java:7770)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1047)
我们可以看到错误报告表明没有权限,但我正在请求权限并且用户正在授予权限。
下面是另一个相同错误但在不同设备上的堆栈跟踪。
Caused by: java.lang.NullPointerException:
at package.SomeActivity.b (SomeActivity.java:71)
at package.SomeActivity.onRequestPermissionsResult (SomeActivity.java:187)
at android.app.Activity.dispatchRequestPermissionsResult (Activity.java:8474)
at android.app.Activity.dispatchActivityResult (Activity.java:8296)
at android.app.ActivityThread.deliverResults (ActivityThread.java:5090)
at android.app.ActivityThread.handleSendResult (ActivityThread.java:5138)
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:2147)
at android.os.Handler.dispatchMessage (Handler.java:107)
at android.os.Looper.loop (Looper.java:237)
at android.app.ActivityThread.main (ActivityThread.java:7814)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1068)
不同之处在于,在第一种情况下,错误是上述情况下的安全异常,它是 NullPointerException,它指向代码中的这一行:grantUriPermission(getPackageName(),currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
所以,我不确定,但可能是 onActivityResult 正在返回一个空 uri(Uri currentUri=data.getdata() 为空)并且应用程序没有路径或权限来创建导致应用程序崩溃的目录。
所以,我想知道我做错了什么以及为什么它只影响少数设备(三星设备中的五个案例四个)。我将不胜感激有关此的任何帮助。提前致谢。