如何检查从action_open_document树中选择的Uri用户是否来自可移动SD卡? 我检查这个,但它相同的主SD卡和可移动SD卡! 还有其他办法吗?
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String id=DocumentsContract.getTreeDocumentId(uri);
Uri mainuri=DocumentsContract.buildDocumentUriUsingTree(uri,id);
grantUriPermission(G.context.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
if( "com.android.externalstorage.documents".equals(uri.getAuthority())){
// its return true for primary and removable sd card !!
}
答案 0 :(得分:1)
没有
不要求存储提供商的Uri
以任何方式识别。您的假设(某个存储提供商的权限为com.android.externalstorage.documents
)在任何Android设备上都不一定正确。设备制造商可以提供自己的存储提供商,具有自己的Uri
结构。
答案 1 :(得分:1)
自android Q起,您必须使用SAF。为了知道URI是否是可移动媒体,您可以尝试使用路径字符串:如果在uri.getPath()中找到类似于“ HHHH-HHHH:”(其中H =十六进制字符串字符)的字符串,则表示是可移动媒体。
/**
* Check if SAF uri point to a removable media
* Search for this regular expression:
* ".*\\b[ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]]-[ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]]:\\b.*"
* @param uri: SAF URI
* @return true if removable, false if is internal
*/
public boolean isRemovable (Uri uri) {
String path = uri.getPath();
String r1 = "[ABCDEF[0-9]]";
String r2 = r1 + r1 + r1 + r1;
String regex = ".*\\b" + r2 + "-" + r2 + ":\\b.*";
if (path != null) {
return path.matches(regex);
} else return false;
}
最后一种方法使用较少的内存。以下方法是更快的螺母,由于使用正则表达式字符串会消耗更多的内存,但又又短又快:
public boolean isRemovable (Uri uri) {
String path = uri.getPath();
if (path != null) {
return path.matches(".*\\b[ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]]-[ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]]:\\b.*");
} else return false;
}
更新: 原始正则表达式仅适用于SDCARD上的子文件夹。要包含根目录,请删除最后一个'\ d'字符。这是正确的REGEX:
".*\\b[ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]]-[ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]][ABCDFE[0-9]]:.*"
所以正确的功能应该是:
private boolean isRemovable (Uri uri) {
String path = uri.getPath();
String r1 = "[ABCDEF[0-9]]";
String r2 = r1 + r1 + r1 + r1;
String regex = ".*\\b" + r2 + "-" + r2 + ":.*";
if (path != null) {
return path.matches(regex);
} else return false;
}