2009-05-23 10 views
16

Pracuję nad aplikacją dla systemu Android, która musi sprawdzić, jakie obrazy przechowywał użytkownik. Problem polega na tym, że jeśli użytkownik ma kartę SD zamontowaną za pośrednictwem kabla USB, nie mogę odczytać listy obrazów na dysku.Jak sprawdzić, czy sdcard jest zamontowany w systemie Android?

Czy ktoś wie, w jaki sposób można sprawdzić, czy urządzenie USB jest zamontowane, aby po prostu pojawił się komunikat informujący użytkownika, że ​​nie będzie działać?

+4

Tylko dla przypomnienia, podłączając kabel USB nie jest jedynym sposobem, aby uzyskać objętość sdcard odłączony - spowoduje to również odmontowanie karty w ustawieniach przechowywania lub fizyczne usunięcie karty. Ponadto sdcards o pojemności 8 GB dostarczane przez t-mobile uk nie są poprawnie sformatowane, więc z powodu operacji wejścia/wyjścia są one cały czas odłączane, o ile nie zostały poprawnie sformatowane. Mówię to tylko dlatego, że czasami wystarczy powiedzieć użytkownikowi, żeby odłączyć kabel, to nie wystarczy. –

Odpowiedz

37

Jeśli próbujesz uzyskać dostęp do obrazów na urządzeniu, najlepszą metodą jest użycie MediaStore content provider. Uzyskanie dostępu do niego w postaci content provider umożliwi zapytanie o obrazy, które są obecne, i mapowanie adresów URL do ścieżek do plików na urządzeniu tam, gdzie jest to właściwe.

Jeśli nadal mieć dostęp do karty SD, aplikacja Aparat zawiera klasę ImageUtils, który sprawdza, czy karta SD jest zamontowany w sposób następujący:

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

lo, ktoś zapewnia Android api sposób robienia rzeczy. Głosować! –

+2

Gdzie jest metoda 'checkFsWritable();'? – GrIsHu

+0

Czy potrzebujemy '', aby działał na pamięci zewnętrznej? –

1

Przepraszam za opublikowanie sposobu, w jaki nie robimy tego w Androidzie, mam nadzieję, że ktoś może udzielić odpowiedzi za pomocą interfejsu API Androida.

Możesz wyświetlić listę plików w katalogu głównym sdcard. Jeśli go nie ma, sdcard jest całkowicie puste (nietypowe, ale możliwe) lub jest odłączone. Jeśli spróbujesz utworzyć pusty plik na sdcard i nie powiedzie się, oznacza to, że próbujesz utworzyć plik w punkcie montowania sdcard, który zostałby odmówiony z powodu problemu z uprawnieniami, więc wiedziałbyś, że sdcard nie był zamontowane.

Tak, wiem, że to jest brzydkie ....

1
public static boolean isSdPresent() { 

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

} 
+0

@MartinSmith źródłem tam też jest ja – Harinder

9

Oto brakująca funkcja checkFsWritable w jargonjustin poczta

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

Użyłem kursor do pobierania zdjęć z karty SD i gdy nie ma karty SD w urządzeniu kursor był zerowy. W rzeczywistości ma to miejsce, gdy wolumin sdcard został odłączony przez fizyczne usunięcie karty z urządzenia. Jest to kod użyłem:

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(); 
    } 

Więcej informacji: http://developer.android.com/guide/topics/media/mediaplayer.html#viacontentresolver

0

Na jargonjustin poście:

pliku ImageManager.java

Metoda 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; 
    } 

Metoda 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

Przed wykonywać żadnej pracy z pamięci zewnętrznej, należy zawsze zadzwonić getExternalStorageState(), aby sprawdzić, czy nośnik jest dostępny. Nośniki mogą być podłączone do komputera, brakuje go, tylko do odczytu lub w innym stanie.Na przykład, oto sposoby para może użyć, aby sprawdzić dostępność:

/* 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; 
} 

źródło: http://developer.android.com/guide/topics/data/data-storage.html

Powiązane problemy