Как создать каталог в Загрузках в android q с помощью инфраструктуры доступа к хранилищу - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь создать каталог своего приложения в папке 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). Я был бы признателен за любую помощь относительно это.Заранее спасибо.

...