スプラッシュ画面で、電話に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カードですが、保護された内部ストレージとは別のデバイスに組み込みストレージとして実装され、コンピューターにファイルシステムとしてマウントすることもできます。
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";
}
すべきではありません:
_boolean isPresent = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED
);
_
ドキュメントに記載されているように Environment.getExternalStorageState()
:
プライマリ「外部」ストレージデバイスの現在の状態を取得します。
そして _Environment.MEDIA_MOUNTED
_-定数 の場合:
getExternalStorageState()
は_MEDIA_MOUNTED
_を返しますメディアが存在し、読み取り/書き込みアクセスでマウントポイントにマウントされている場合。
そしてこれはAPIレベル1以降で機能します
2つのメモリステータスがあります。 1つは内部メモリカードで、もう1つは外部SDカードです。これは、デバイスの製造元がメモリカードパスをどのように製造したかによって異なります。したがって、SDカードの可用性を確認している場合は、内部メモリが原因でどちらの場合もtrueを返す可能性があります。したがって、この方法を選択してください。
File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null);
if(listOfInternalAndExternalStorage.length>=2){
// it contains sd card
}
上記のコードは、listOfInternalAndExternalStorageが複数あるかどうかをチェックし、外部ストレージがあるかどうかを確認します。そうでない場合は、SDカードが含まれていません。
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();
}
//外部を保存したい場合はこれを試してください...
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;
}