Проверьте, если URI из съемного хранилища

Как проверить, получен ли пользователь Uri, выбранный в дереве action_open_document, со съемной 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 !!


}

1 ответ

Начиная с Android Q, вы должны использовать SAF. Чтобы узнать, является ли URI съемным носителем, вы можете попробовать использовать строку пути: если вы найдете строку типа "HHHH-HHHH:" (где H = шестнадцатеричный строковый символ) в uri.getPath(), это означает, что это съемный носитель.

 /**
 * 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'. Это правильный РЕГЕКС:

".*\\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;
}

Нет.

Не требуется, чтобы Uri от поставщика хранилища быть идентифицируемым в любом случае. Ваше предположение (что авторитет com.android.externalstorage.documents для определенного поставщика услуг хранения) не должен быть правильным на любом устройстве Android. Производители устройств могут снабжать своих собственных поставщиков услуг хранения своими собственными Uri структур.

Другие вопросы по тегам