Как узнать, монтируется ли sdcard в Android? - PullRequest
16 голосов
/ 23 мая 2009

Я работаю над приложением Android, которое должно посмотреть, какие изображения пользователь сохранил. Проблема в том, что если у пользователя есть sdcard, подключенный через USB-кабель, я не могу прочитать список изображений на диске.

Кто-нибудь знает, как определить, смонтирован ли usb, чтобы я мог просто вызвать сообщение, информирующее пользователя о том, что оно не будет работать?

Ответы [ 8 ]

38 голосов
/ 24 мая 2009

Если вы пытаетесь получить доступ к изображениям на устройстве, лучший способ - использовать поставщик контента MediaStore . Доступ к нему как к поставщику контента позволит вам запрашивать имеющиеся изображения и сопоставлять URL-адреса content:// с путями файлов на устройстве, где это необходимо.

Если вам по-прежнему требуется доступ к SD-карте, приложение Camera содержит класс ImageUtils , который проверяет, установлена ​​ли SD-карта следующим образом:

static public boolean hasStorage(boolean requireWriteAccess) {
    //TODO: After fix the bug,  add "if (VERBOSE)" before logging errors.
    String state = Environment.getExternalStorageState();
    Log.v(TAG, "storage state is " + state);

    if (Environment.MEDIA_MOUNTED.equals(state)) {
        if (requireWriteAccess) {
            boolean writable = checkFsWritable();
            Log.v(TAG, "storage writable is " + writable);
            return writable;
        } else {
            return true;
        }
    } else if (!requireWriteAccess && Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}
9 голосов
/ 20 июня 2012

Вот недостающая функция checkFsWritable в jargonjustin post

private static boolean checkFsWritable() {
        // Create a temporary file to see whether a volume is really writeable.
        // It's important not to put it in the root directory which may have a
        // limit on the number of files.
        String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM";
        File directory = new File(directoryName);
        if (!directory.isDirectory()) {
            if (!directory.mkdirs()) {
                return false;
            }
        }
        return directory.canWrite();
    }
1 голос
/ 11 августа 2013

На пост Жаргонюстина:

Файл ImageManager.java

Метод hasStorage ->

public static boolean hasStorage(boolean requireWriteAccess) {
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            if (requireWriteAccess) {
                boolean writable = checkFsWritable();
                return writable;
            } else {
                return true;
            }
        } else if (!requireWriteAccess
                && Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }

Метод checkFsWritable ->

 private static boolean checkFsWritable() {
        // Create a temporary file to see whether a volume is really writeable.
        // It's important not to put it in the root directory which may have a
        // limit on the number of files.
        String directoryName =
                Environment.getExternalStorageDirectory().toString() + "/DCIM";
        File directory = new File(directoryName);
        if (!directory.isDirectory()) {
            if (!directory.mkdirs()) {
                return false;
            }
        }
        File f = new File(directoryName, ".probe");
        try {
            // Remove stale file if any
            if (f.exists()) {
                f.delete();
            }
            if (!f.createNewFile()) {
                return false;
            }
            f.delete();
            return true;
        } catch (IOException ex) {
            return false;
        }
    }
1 голос
/ 27 сентября 2011
public static boolean isSdPresent() {

return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

}
1 голос
/ 24 мая 2009

Я прошу прощения за публикацию не-Android способа сделать это, надеюсь, кто-то может предоставить ответ, используя Android API.

Вы можете перечислить файлы в корне SDCard. Если его нет, SD-карта либо полностью пуста (необычно, но возможно), либо отключена. Если вы попытаетесь создать пустой файл на SD-карте, и это не удастся, это означает, что вы пытались создать файл в точке монтирования SD-карты, в котором было бы отказано из-за проблем с разрешениями, поэтому вы бы знали, что SD-карта не была установлен.

Да, я знаю, это ужасно ...

0 голосов
/ 04 января 2015

Прежде чем выполнять какую-либо работу с внешним хранилищем, вы всегда должны вызывать getExternalStorageState (), чтобы проверить, доступен ли носитель. Носитель может быть подключен к компьютеру, отсутствует, доступен только для чтения или находится в каком-либо другом состоянии. Например, вот несколько методов, которые вы можете использовать для проверки доступности:

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

Источник: http://developer.android.com/guide/topics/data/data-storage.html

0 голосов
/ 09 июня 2014
Cool....Check it out...
try {
            File mountFile = new File("/proc/mounts");
            usbFoundCount=0;
            sdcardFoundCount=0;
            if(mountFile.exists())
             {
                Scanner usbscanner = new Scanner(mountFile);
                while (usbscanner.hasNext()) {
                    String line = usbscanner.nextLine();
                    if (line.startsWith("/dev/fuse /storage/usbcard1")) {
                        usbFoundCount=1;
                        Log.i("-----USB--------","USB Connected and properly mounted---/dev/fuse /storage/usbcard1" );
                    }
            }
         }
            if(mountFile.exists()){
                Scanner sdcardscanner = new Scanner(mountFile);
                while (sdcardscanner.hasNext()) {
                    String line = sdcardscanner.nextLine();
                    if (line.startsWith("/dev/fuse /storage/sdcard1")) {
                        sdcardFoundCount=1;
                        Log.i("-----USB--------","USB Connected and properly mounted---/dev/fuse /storage/sdcard1" );
                    }
            }
         }
            if(usbFoundCount==1)
            {
                Toast.makeText(context,"USB Connected and properly mounted", 7000).show();
                Log.i("-----USB--------","USB Connected and properly mounted" );
            }
            else
            {
                Toast.makeText(context,"USB not found!!!!", 7000).show();
                Log.i("-----USB--------","USB not found!!!!" );

            }
            if(sdcardFoundCount==1)
            {
                Toast.makeText(context,"SDCard Connected and properly mounted", 7000).show();
                Log.i("-----SDCard--------","SDCard Connected and properly mounted" );
            }
            else
            {
                Toast.makeText(context,"SDCard not found!!!!", 7000).show();
                Log.i("-----SDCard--------","SDCard not found!!!!" );

            }
        }catch (Exception e) {
            e.printStackTrace();
        } 
0 голосов
/ 17 июля 2012

Я использовал курсор для получения изображений с SD-карты, и когда SD-карта не была вставлена ​​в устройство, курсор был нулевым. На самом деле это тот случай, когда том SDCard был отключен путем физического извлечения карты из устройства. Это код, который я использовал:

  Cursor mCursor = this.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
    if (mCursor == null || !mCursor .moveToFirst()) {
                /**
                 *mCursor == null:
                 * - query failed; the app don't have access to sdCard; example: no sdCard 
                 *
                 *!mCursor.moveToFirst():
                 *     - there is no media on the device
                 */
            } else {
                 // process the images...
                 mCursor.close(); 
    }

Подробнее: http://developer.android.com/guide/topics/media/mediaplayer.html#viacontentresolver

...