我的 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。为什么它不起作用?什么是正确的代码?