Я пытаюсь создать каталог своего приложения в папке Download устройства. Я пытаюсь использовать структуру доступа к хранилищу для создания каталога на устройствах, работающих на 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 и также запросил разрешение у пользователей. Я спросил некоторых пользователей, на чьем устройстве происходит сбой приложения, и они предоставили все разрешения, поэтому я не уверен, в чем проблема и почему это происходит только на нескольких устройствах.
Ниже приведена трассировка стека из один из сбоев:
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 (Urigetdata (Urigetdata) = data). приложение не имеет пути или разрешения на создание каталога, который вызывает ap p to cra sh.
Итак, я хотел бы знать, что я делаю не так и почему это влияет только на несколько устройств (пять случаев, четыре из них на устройствах Samsung). Я был бы признателен за любую помощь относительно это.Заранее спасибо.