Storage Access Framework - папка, выбранная пользователем на диске, не позволяет создавать папку внутри - PullRequest
0 голосов
/ 09 июля 2019

Мое приложение Android использует Storage Access Framework на дисковых позициях.

Типичный Uri в этих позициях имеет следующую форму:

content://com.android.externalstorage.documents/tree/primary:mainFolder/subFolder

, если путь похож на / mainFolder /subFolder.

Приложение позволяет пользователю выбрать (и авторизовать) папку на диске.

Так называется средство выбора:

static public void openPickerForFolderSelection(Activity activity, int requestCode)
{
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    activity.startActivityForResult(intent, requestCode);
}

В onActivityResultметод называется следующий код:

static public String takePermanentReadWritePermissions(Activity activity, Intent data)
{
int takeFlags = data.getFlags()
        &
        (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
ContentResolver resolver = activity.getContentResolver();
resolver.takePersistableUriPermission(data.getData(),takeFlags);
return data.getData().toString(); //very important for archiving the Uri

}

Uri правильно заархивирован в виде строки (toString ()).

Вот как проверяются разрешения (и бывает, что онив моем случае):

static boolean arePermissionsGranted(Activity activity, String uriString)
{
ContentResolver resolver = activity.getContentResolver();
List<UriPermission> list = resolver.getPersistedUriPermissions();
for (int i = 0; i < list.size(); i++){
    if(((Uri.decode(list.get(i).getUri().toString())).equals( uriString)) && list.get(i).isWritePermission()&& list.get(i).isReadPermission()){
        return true;
    }
}
return false;
}

В другом месте приложения должна быть создана папка:

/ mainFolder / subFolder / theFolder

Вот какпапка создана:

static public boolean creatFolderInFolder(Activity activity,String parentFolderUriString,String folderName)
{
    boolean result=false;
    ContentResolver contentResolver;
    contentResolver = activity.getContentResolver();
    Uri parentFolderUri=null;
    parentFolderUri= DocumentsContract.buildDocumentUri(PROVIDER_AUTHORITY,
    DocumentsContract.getDocumentId(Uri.parse(parentFolderUriString)));
    try {
    DocumentsContract.createDocument(contentResolver,parentFolderUri,DocumentsContract.Document.MIME_TYPE_DIR,folderName);
        result=true;
    } catch (FileNotFoundException e) 
    {
    result =false;
    }
    return result;
}

Вызов метода выполняется со следующими параметрами:

parentFolderUriString "content: //com.android.externalstorage.documents/tree/primary: mainFolder / subFolder"

имя_папки "theFolder"

Iполучить:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydomain.app/com.mydomain.app.activityName}: java.lang.IllegalArgumentException: Invalid URI: content://com.android.externalstorage.documents/tree/primary:mainFolder/subFolder

в строке:

DocumentsContract.buildDocumentUri(PROVIDER_AUTHORITY,
    DocumentsContract.getDocumentId(Uri.parse(parentFolderUriString)));

Почему я получаю эту ошибку?

...