17

ユーザーが保存した画像を確認する必要がある Android アプリケーションに取り組んでいます。問題は、ユーザーが USB ケーブルを介してマウントされた sdcard を持っている場合、ディスク上のイメージのリストを読み取れないことです。

USBがマウントされているかどうかを確認して、ユーザーに動作しないことを知らせるメッセージをポップアップ表示できる方法を知っている人はいますか?

4

8 に答える 8

41

デバイス上の画像にアクセスしようとしている場合、最適な方法はMediaStore コンテンツ プロバイダーを使用することです。コンテンツ プロバイダーとしてアクセスすると、存在する画像をクエリし、content://必要に応じて URL をデバイス上のファイル パスにマップできます。

それでも SD カードにアクセスする必要がある場合、カメラ アプリケーションには、次のように SD カードがマウントされているかどうかを確認するImageUtilsクラスが含まれています。

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;
}
于 2009-05-23T22:50:47.767 に答える
9

jargonjustinこれは、投稿に欠けている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;
            }
        }
        return directory.canWrite();
    }
于 2012-06-20T03:33:05.333 に答える
2

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;
        }
    }
于 2013-08-11T15:29:15.170 に答える
2

これを行う Android 以外の方法を投稿して申し訳ありませんが、誰かが Android API を使用して回答を提供できることを願っています。

SD カードのルートにあるファイルを一覧表示できます。何もない場合、sd カードは完全に空白 (通常ではありませんが、可能性があります) であるか、マウントされていません。SDカードに空のファイルを作成しようとして失敗した場合は、SDカードのマウントポイントにファイルを作成しようとしていたことを意味し、権限の問題により拒否されたため、SDカードが作成されていないことがわかりますマウント。

はい、私はこれが醜いことを知っています....

于 2009-05-23T20:38:43.993 に答える
2
public static boolean isSdPresent() {

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

}
于 2011-09-27T07:03:35.383 に答える
0

SDカードから画像を取得するためにカーソルを使用していましたが、デバイスにSDカードが挿入されていない場合、カーソルはnullでした。実際には、デバイスからカードを物理的に取り外して SD カード ボリュームをアンマウントした場合がこれに該当します。これは私が使用したコードです:

  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

于 2012-07-17T14:40:53.513 に答える
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

于 2015-01-04T06:39:18.877 に答える