Мое приложение 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 должен быть проверен без этого трюка. Почему это не работает? Какой правильный код?