Как получить путь Odo SDCard? - PullRequest
0 голосов
/ 14 января 2020

Я хочу удалить дубликаты файлов с SD-карты. Поэтому мне нужно получить доступ к файлам SD-карты, которые дают мне полный путь. например. / storage / 0C08-291C / Android / Docs / file-sample_500kB.rtf

Я получил путь к SD-карте для всех Android версий, превышающих Уровень SDK 22 * ​​1008 *, но не удается получить доступ к SD-карте на Android 8 Oreo Версия 8.0 и Версия 8.1 Уровень SDK 26 и 27 .

Я использую метод ниже, чтобы получить SD-карту root путь:

public static String getExternalStoragePath(Context mContext, boolean is_removable) {
    StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
    Class<?> storageVolumeClazz = null;
    try {
        storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
        Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
        Method getPath = storageVolumeClazz.getMethod("getPath");
        Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
        Object result = getVolumeList.invoke(mStorageManager);
        final int length = Array.getLength(result);
        for (int i = 0; i < length; i++) {
            Object storageVolumeElement = Array.get(result, i);
            String path = (String) getPath.invoke(storageVolumeElement);
            boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
            if (is_removable == removable) {
                return path;
            }
        }
    } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}

Этот метод возвращает ноль on Android Версия 8, даже если установленное состояние SD-карты true .

Я проверяю состояние SD-карты, используя следующую строку:

boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

И получение пути SD-карты как:

String externalSdCard = getExternalStoragePath(mContext, true);

Как только я получил externalSdCard я вызываю приведенный ниже метод для GRANT URI PERMISSION до SD Card .

public void takeCardUriPermission(String sdCardRootPath) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        File sdCard = new File(sdCardRootPath);
        StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
        StorageVolume storageVolume = storageManager.getStorageVolume(sdCard);
        Intent intent = null;
        if (storageVolume != null) {
            intent = storageVolume.createAccessIntent(null);
        }
        try {
            startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Для вызова takeCardUriPermission (String sdCardRootPath) метода Мне нужно SD-карта root путь . и мой вопрос это "Как получить root путь SD-карты на Android 8 Oreo"

Ответы [ 2 ]

0 голосов
/ 14 января 2020

@ blackapps Ниже приведен мой код для получения пути SD-карты root.

Активность:

String externalSdCard = getExternalStoragePath ( mContext, true); ... здесь externalSdCard , я получаю нулевое значение для Android 8 Oreo SDK уровня 26 и 27 . Другое Уровень SDK> = 22 * ​​1014 * работает хорошо.

Метод:

public static String getExternalStoragePath(Context mContext, boolean is_removable) {
    StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
    Class<?> storageVolumeClazz = null;
    try {
        storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
        Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
        Method getPath = storageVolumeClazz.getMethod("getPath");
        Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
        Object result = getVolumeList.invoke(mStorageManager);
        final int length = Array.getLength(result);
        for (int i = 0; i < length; i++) {
            Object storageVolumeElement = Array.get(result, i);
            String path = (String) getPath.invoke(storageVolumeElement);
            boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
            if (is_removable == removable) {
                return path;
            }
        }
    } catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}
0 голосов
/ 14 января 2020

https://developer.android.com/reference/android/os/Environment.html#getExternalStorageDirectory ()

Environment.getExternalStorageDirectory()

Примечание. С Android Q для этого метода не рекомендуется.

...