Android アプリのデータを内部メモリではなく SD カードに保存する方法はありますか? アプリケーションの sqlite データベースを内部メモリから SDCard に転送する方法は知っていますが、そもそも内部メモリがいっぱいになったらどうすればよいでしょうか? 誰もがこれをどのように処理しますか?
6 に答える
「/sdcard」をハードコードするよりも、 Environment.getExternalStorageDirectory()を使用する方が良い方法です。フォルダー名がそのように呼ばれるかどうかは必ずしも確実ではありません。また、Environment クラスは getExternalStorageState() メソッドを提供して、外部ストレージが利用可能かどうかをチェックします。
始める:
モデル/OS によっては、次の方法で SD カードのルート ディレクトリにアクセスできます。
File externalStorage = Environment.getExternalStorageDirectory();
これは、内部 SD ストレージまたは内部 SD メモリを指します。
externalStorage.getAbsolutePath()
次のいずれかの値を返します
「/sdcard/」または「/mnt/sdcard/」
通常は電話/タブレットの外側から接続する外部 SD メモリまたはマイクロ SD にアクセスするには、外部メモリを指すように Android が作成する次のいずれかのフォルダを使用する必要があります。
"/mnt/sdcard/sd"
"/mnt/sdcard/external_sd"
"/sdcard/external_sd"
"/sdcard/sd"
"/mnt/sdcard/"
external_sd
ps: 空のフォルダーまたはsd
内部 SD カードに気付くことができます
このフォルダは空で、外部マイクロ SD カードを指すために使用されます。
android.permission.WRITE_EXTERNAL_STORAGE
最後に、Android マニフェスト xml でSD カードへの読み取り/書き込みアクセス権があることを確認してください。
最後に、ファイル名と準備完了を指定する必要があります
private SQLiteDatabase DB = null;
private static final String DATABASE_NAME = "MyDb.db";
////////////
File sdcard = Environment.getExternalStorageDirectory();
String dbfile = sdcard.getAbsolutePath() + File.separator+ "external_sd" + File.separator + DATABASE_NAME;
DB = SQLiteDatabase.openDatabase(dbfile, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS);
///////////
そしてあなたの行く準備ができています...
ここで、もう 1 つの巧妙な小技を紹介します。アプリケーションには、パスを取得するために呼び出されるいくつかのメソッドがあります。特に、アプリケーションにはgetDatabasePathメソッドがあり、 SQLiteOpenHelperがパスを作成するために使用します。カスタム アプリケーション クラスは、これらのメソッドをオーバーライドして、 getExternalStorageDirectory内のパスを含むさまざまなパスを提供できます。
外部ストレージは、アプリケーション固有またはパブリックのいずれかです。getExternalStorageDirectoryメカニズムを 置き換えるメソッドとして、それぞれ getExternalFilesDir ()およびgetExternalStoragePublicDirectory()があります。
警告:この回答は古くなっています。以下の回答に記載されているように、 Environment.getExternalStorageDirectory()を使用してSDカードのルートパスを取得する必要があります。
古い答えなので、これに関するコメントは理にかなっています:
ルートにパスを追加/sdcard/
すると、AndroidアプリケーションにSDカードを使用するように指示する必要があります(少なくともG1ではそのように機能します)。Androidのファイルシステムオブジェクトを使用すると、ファイルサイズを確認できます。したがって、(トリッキーな場合は)フェイルオーバーコードを記述できるはずです。このコードは、内部メモリがいっぱいになった場合にルートパスを調整します。
一部のデバイスは、/mnt/sdcard を SD カードへのルート ポイントとして使用します。
SDCard を使用する際の問題は、アプリケーションが必要とするときに常に SDCard が存在すると確実に想定できないことです。これは、内蔵メモリには当てはまりません。アプリケーションがこのデータに依存して実行されない限り、問題はありません。