SAF - метод проверки папки Uri существования дает всегда true - PullRequest
0 голосов
/ 01 октября 2019

Мое приложение Android должно проверить, присутствует ли в файловой системе папка Uri (родительская папка была выбрана пользователем, поэтому она авторизована). Следующий код предназначен для выполнения проверки:

static public boolean folderExists(Activity activity,String folderUriString)
{
ContentResolver contentResolver;
contentResolver = activity.getContentResolver();

Log.d("folder name",folderUriString); // it's content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Faccesspoint1/subfoldername
Uri folderUri = Uri.parse(folderUriString);
boolean isTreeUri=DocumentsContract.isTreeUri(folderUri);
boolean exists = DocumentFile.fromTreeUri (activity,folderUri).exists();

Log.d("is treeUri",String.valueOf(isTreeUri)); //true
Log.d("folder exists",String.valueOf(exists)); //true

return exists;
}

Этот код не работает, поскольку он возвращает истинное значение, если папка не существует (никогда не создавалась, не создавалась и не удалялась), даже если родительский объектсама папка не существует.

Обратите внимание, что URI еще не существует наверняка. Я использую приложение файловой системы на своем устройстве для проверки каталогов.

Строка uri создается с помощью этого метода:

public static String appendUriString(String originalUriString,String appendedUriPath)
{
    String result;
    Uri uri=Uri.parse(originalUriString);
    result=Uri.withAppendedPath(uri,appendedUriPath).toString();
Log.d("appendUri",result);    
    return result;
}

content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Faccesspoint1/subfoldername

Как видно, полученный uri представляет собой смешанную форму с закодированными и некодированными символами, поэтому он допустим, потому чтометод SAF создал полный URI.

Другая версия метода folderExists разделяет строки URI, чтобы получить родительскую папку. Но я думаю, что URI должен быть проверен без этого трюка. Почему это не работает? Какой правильный код?

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Вы уже получили код, чтобы проверить, существует ли в дереве папка, полученная с помощью ACTION_OPEN_DOCUMENT_TREE:

SAF - Попытка создать существующую папку / файл приводит к созданию новой папки / файла

Что с ним не так?

Если вы хотите дать ему другую реализацию, продолжайте.

Далее: никто не знает значений параметров, с которыми вы вызываете appendUriString (), тактрудно увидеть, что происходит или идет не так. Ни как вы вызываете другую функцию. Пожалуйста, отправьте воспроизводимый код.

0 голосов
/ 01 октября 2019

Попробуйте использовать fromSingleUri вместо fromTreeUri. Может также стоить проверить, действительно ли выбран DocumentFile isDirectory.

static public boolean folderExists(Activity activity, String folderUriString) {
    Log.d("folder name",folderUriString); // it's content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2Faccesspoint1/subfoldername
    Uri folderUri = Uri.parse(folderUriString);
    DocumentFile pickedDir = DocumentFile.fromSingleUri(activity, folderUri);

    return pickedDir != null && pickedDir.exists();
}
...