21

スプラッシュ画面で、電話にSDカードがあるかどうかを確認したいと思います。ブール式は次のとおりです。

    Boolean isSDPresent = android.os.Environment.getExternalStorageState()
            .equals(android.os.Environment.MEDIA_MOUNTED );

したがって、SDカードを携帯電話のスロットに挿入すると、このブール値はtrueに戻りますが、これまでのところ良好です。設定メニューから[SDカードのマウント解除]に移動し、SDカードを削除してから、アプリを強制終了して再度起動すると、ブール値もtrueになります。

Astro File Managerまた、SDカードをアンマウントして取り外した後に起動した場合でも、/mnt/sdcardパスにアクセスできます。なぜですか?

どうすればこれを達成できますか?

前もって感謝します!

編集

次のコードでテストします。

File path = Environment.getExternalStorageDirectory(); 
String pathS = path.getPath();

SDカードがスロットにあるときは、がpathS含まれていますmnt/sdcardが、SDカードを取り外してpathSもまだ/mnt/sdcard...

4

7 に答える 7

13

サムスンのギャラクシー電話のような電話は、/mnt/sdcard期待どおりに外部SDカードではなく、内部メモリを指していることがわかりました。

Environment.getExternalStorageDirectory()によって返されるパスが、Environment.isExternalStorageRemovable()呼び出すことで実際に外部SDカードであるかどうかを知ることができます。

getExternalStorageDirectory()のドキュメントから、この重要な注意事項を追加したかっただけです。

注:ここで「外部」という言葉と混同しないでください。このディレクトリは、メディア/共有ストレージと考えるとよいでしょう。これは、比較的大量のデータを保持でき、すべてのアプリケーション間で共有されるファイルシステムです(権限を強制しません)。従来、これはSDカードですが、保護された内部ストレージとは別のデバイスに組み込みストレージとして実装され、コンピューターにファイルシステムとしてマウントすることもできます。

于 2012-08-23T08:22:51.433 に答える
2

すべきではありません:

boolean isPresent = Environment.getExternalStorageState().equals(
   Environment.MEDIA_MOUNTED
);

ドキュメントに記載されているようにEnvironment.getExternalStorageState()

プライマリ「外部」ストレージデバイスの現在の状態を取得します。

そしてEnvironment.MEDIA_MOUNTED-定数のために:

getExternalStorageState()MEDIA_MOUNTED メディアが存在し、読み取り/書き込みアクセスでマウントポイントにマウントされている場合に戻ります。

そして、これはAPIレベル1以降で機能します

于 2012-08-23T08:30:02.380 に答える
2

SDカードが存在する場合は、内部ディレクトリにパスを設定しない場合は、そこにパスを設定するように変更しました

    Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
    if(isSDPresent)
    {
      path = theAct.getExternalCacheDir().getAbsolutePath() + "/GrammarFolder";
    }
    else
    {
        path = theAct.getFilesDir() + "/GrammarFolder";
    }
于 2013-09-02T12:31:16.623 に答える
1

SDカードが挿入されているかどうかを確認したい場合は、このコードをコピーして貼り付けるだけで、すべてのデバイスで100%機能します。コードは次のとおりです。

File file = new File("/mnt/extSdCard");
         try
         {
         File list[] = file.listFiles();
         Toast.makeText(getApplicationContext(), "Yes sdcard is mounted, file count "+list.length, Toast.LENGTH_LONG).show();
         }
         catch(NullPointerException o)
         {
         Toast.makeText(getApplicationContext(), "Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show();
         }
于 2015-08-03T15:34:37.043 に答える
1

2つのメモリステータスがあります。1つは内部メモリカードで、もう1つは外部SDカードです。これは、デバイスの製造元がメモリカードパスをどのように製造したかによって異なります。したがって、SDカードの可用性を確認している場合は、内部メモリが原因でどちらの場合もtrueを返す可能性があります。したがって、この方法を選択してください。

File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null); 
   if(listOfInternalAndExternalStorage.length>=2){
     // it contains sd card
   }

上記のコードは、listOfInternalAndExternalStorageが複数あるかどうかをチェックし、外部ストレージがあるかどうかを確認します。そうでない場合は、SDカードが含まれていません。

于 2017-11-22T07:09:27.433 に答える
0

//外部を保存したい場合はこれを試してください...

public  String preferextstorage(Context con){
    int version = Build.VERSION.SDK_INT;
    String result=con.getFilesDir().getPath();
    if (version>=19) {
    File[] listOfInternalAndExternalStorage = con.getExternalFilesDirs(null);
    if (listOfInternalAndExternalStorage.length >= 2) {
            // it contains sd card
            if (listOfInternalAndExternalStorage[1]==null){
                result=listOfInternalAndExternalStorage[0].getPath();
            }else
            {
                result=listOfInternalAndExternalStorage[1].getPath();
            }
            return result;
        }
    }
    return result;
}
于 2018-04-19T04:18:51.050 に答える
-2

このコードスニペットは、Samsungデバイスの例外を検出して処理するのに役立つ場合があります。

public static String getExternalStorage() {

    String str = Environment.getExternalStorageDirectory().getAbsolutePath();
    if ( isSamsungDevice() ) {
        if ( isSamsungExternalSDMounted() ) {
            str += "/external_sd";
        }
    }
    return str;
}

private static boolean isSamsungDevice() {

    return new File( Environment.getExternalStorageDirectory().getAbsolutePath() + "/external_sd" ).exists();
}

private static boolean isSamsungExternalSDMounted() {

    return exec( "mount" ).indexOf( "external_sd" ) >= 0;
}

public static String exec( String paramString ) {

    try {
        String str = "";
        InputStream localInputStream = Runtime.getRuntime().exec( paramString ).getInputStream();
        byte[] arrayOfByte = new byte[1024];
        StringBuilder localStringBuilder = new StringBuilder();
        while ( true ) {

            int i = localInputStream.read( arrayOfByte, 0, arrayOfByte.length );
            if ( i == -1 ) {
                str = localStringBuilder.toString();
                break;
            }

            localStringBuilder.append( new String( arrayOfByte, 0, i ) );
        }

        return str;
    } catch ( IOException e ) {
        e.printStackTrace();
        return null;
    }
}
于 2012-08-23T08:56:32.803 に答える