Я хочу получить путь к файлу через открыть файл, выбрать startActivityForResult, намерением которого является Intent.ACTION_GET_CONTENT и setType (* / *), но когда я выбираю open из элемента "Nexus 5X", возвращаемое значение URI равно "com.android.externalstorage .documents ", как обращаться с этим типом URI. Есть несколько кодов.

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.ACTION_DEVICE_STORAGE_OK, true);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setType("*/*");
startActivityForResult(intent, FILE_ADD_ACTION_REQUEST_CODE);

Скриншот

2
sohnyi 28 Май 2017 в 12:59

2 ответа

Лучший ответ

URI внешнего хранилища имеют следующую форму:

content://com.android.externalstorage.documents/root%3Apath

Где root - корень носителя, %3A - просто экранированный двоеточие, а path - путь файловой системы относительно корня (также экранированный).

На устройствах с эмулированным первичным хранилищем (т. Е. На современных устройствах Android) корень первичного хранилища (т. Е. /sdcard) обычно называется primary. В других случаях это, кажется, идентификатор носителя (4 + 4 шестнадцатеричные цифры, разделенные дефисом).

Вы также можете попробовать использовать это (требуется API 21 для полной функциональности):

 public static String getRealPathFromURI_API19(Context context, Uri uri) {
    String filePath = "";

    // ExternalStorageProvider
    String docId = DocumentsContract.getDocumentId(uri);
    String[] split = docId.split(':');
    String type = split[0];

    if ("primary".equalsIgnoreCase(type)) {
        return Environment.getExternalStorageDirectory() + "/" + split[1];
    } else {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            //getExternalMediaDirs() added in API 21
            File[] external = context.getExternalMediaDirs();
            if (external.length > 1) {
                filePath = external[1].getAbsolutePath();
                filePath = filePath.substring(0, filePath.indexOf("Android")) + split[1];
            }
        } else {
            filePath = "/storage/" + type + "/" + split[1];
        }
        return filePath;
}
1
user149408 14 Мар 2019 в 00:11

как справиться с этим типом URI

Используйте ContentResolver и openInputStream(), чтобы получить InputStream в контенте, указанном Uri.

0
CommonsWare 28 Май 2017 в 11:11