Как определить, установлена ли sdcard в Android?
Я работаю над приложением Android, которое должно посмотреть, какие изображения пользователь сохранил. Проблема в том, что если у пользователя есть SD-карта, смонтированная через USB-кабель, я не могу прочитать список изображений на диске.
Кто-нибудь знает, как определить, установлен ли USB, чтобы я мог просто открыть сообщение, информирующее пользователя о том, что он не будет работать?
Ответы
Ответ 1
Если вы пытаетесь получить доступ к изображениям на устройстве, лучшим способом является использование Поставщик контента MediaStore. Доступ к нему в качестве поставщика контента позволит вам запрашивать изображения, которые присутствуют, и сопоставлять content://
URL-адреса с файловыми путями на устройстве, где это необходимо.
Если вам все еще нужно получить доступ к 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;
}
Ответ 2
Вот недостающая функция checkFsWritable в jargonjustin
post
private static boolean checkFsWritable() {
// Create a temporary file to see whether a volume is really writeable.
// It 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();
}
Ответ 3
Приносим извинения за публикацию не-Android-способа сделать это, надеюсь, кто-то сможет предоставить ответ с помощью API Android.
Вы можете указать файлы в корневом каталоге sdcard. Если их нет, SD-карта либо полностью пустая (необычная, но и возможная), либо она размонтирована. Если вы попытаетесь создать пустой файл на SD-карте, и это не сработает, это значит, что вы пытались создать файл в точке монтирования sdcard, которая была бы лишена из-за проблемы с разрешениями, поэтому вы знали бы, что sdcard не был установлен.
Да, я знаю, что это уродливо....
Ответ 4
public static boolean isSdPresent() {
return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
}
Ответ 5
Я использовал курсор для извлечения изображений с 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
Ответ 6
На пост 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 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;
}
}
Ответ 7
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();
}
Ответ 8
Прежде чем выполнять какую-либо работу с внешним хранилищем, вы всегда должны вызвать 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