2009-05-23 4 views
16

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

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

+4

Только для записи, подключив кабель USB не единственный способ получить объем SDCARD несмонтированный - размонтирование карты в настройках хранилища или физическое извлечение карты тоже сделают это. Кроме того, 8-гигабайтные sdcards, поставляемые t-mobile uk, предварительно не форматированы должным образом, поэтому из-за ввода-вывода они все время размонтируются, пока они не переформатированы должным образом. Я только говорю это, потому что иногда просто говорить пользователю отключить кабель недостаточно. –

ответ

37

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

Если вам все еще нужно, чтобы получить доступ к SD-карту, приложение Камера включает в себя 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; 
} 
+5

Ло, кто-то предоставляет способ Android для Android. Голосовать! –

+2

Где находится метод 'checkFsWritable();'? – GrIsHu

+0

Нужно ли нам использовать '', чтобы он работал на внешнем хранилище? –

1

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

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

Да, я знаю, что это некрасиво ....

1
public static boolean isSdPresent() { 

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

} 
+0

@MartinSmith источник есть и есть я – Harinder

9

Здесь отсутствует функция 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(); 
    } 
0

Я использовал курсор для извлечения изображений с 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

0

На посту jargonjustin в:

Файл 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; 
     } 
    } 
0
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

Перед тем, как делать какую-либо работу с внешним запоминающим устройством, вы должны всегда вызывать 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

Смежные вопросы