web-dev-qa-db-ja.com

SDカードが存在するかどうかを確認します。ブール値は常にtrueです。

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

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

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

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

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

前もって感謝します!

[〜#〜]編集[〜#〜]

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

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

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

SamsungのGalaxy電話のように、電話は/mnt/sdcardが内部メモリを指し、期待どおりに外部SDカードを指していません。

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

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

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

12
brianestey

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";
    }
2
ArdaA

すべきではありません:

_boolean isPresent = Environment.getExternalStorageState().equals(
   Environment.MEDIA_MOUNTED
);
_

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

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

そして _Environment.MEDIA_MOUNTED_-定数 の場合:

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

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

2
Lukas Knuth

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

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

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

1
Kundan

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();
         }
1
Pir Fahim Shah

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

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;
}
0
Jhan Zeib Khan