Обнаружение карты Micro Sd - PullRequest
3 голосов
/ 23 августа 2011

Есть ли способ обнаружить карту micro sd в андроиде? Я знаю, что класс Environment дает подробности о внешнем хранилище. Но он просто дает встроенные данные SD-карты. Есть ли способ обойти?

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Вы можете использовать isExternalStorageEmulated(), чтобы узнать, является ли текущее «внешнее» хранилище реальным внешним хранилищем или просто частью внутреннего хранилища. Если это реально, тогда вы должны получить свойства съемной карты.

1 голос
/ 23 августа 2011

Попробуйте это:

boolean canSaveExternal = false;
String storageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(storageState))
    canSaveExternal = true;
else
    canSaveExternal = false;
0 голосов
/ 20 марта 2017

Environment.getExternalStorageState () и Environment.getExternalStorageDirectory () предоставят встроенную SD-карту, которая сейчас практически существует на всех устройствах Android на данный момент.

Два способа получить «реальную» внешнюю SD-картукарта (или USB-диск).

  1. Используйте функцию getVolumeList () для вывода списка всех съемных хранилищ, не забудьте проверить состояние монтирования перед тем, как получить к нему доступ.

    private static String getExtendedMemoryPath(Context context) {
        StorageManager mStorageManager = (StorageManager) context.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 (removable) {
                    return path;
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
    
  2. Зарегистрируйте событие android.intent.action.MEDIA_MOUNTED, когда хранилище смонтировано, передаст это намерение с подключенным путем к диску.

    <receiver android:enabled="true" android:name=".MountStatusReceiver">
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>
                <data android:scheme="file"/>
            </intent-filter>
        </receiver>
    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
                if (Intent.ACTION_MEDIA_MOUNTED.equals(intent.getAction())) {
                    path = intent.getDataString().replace("file://", "");
                }
            }
        }
    }
    
...