web-dev-qa-db-ja.com

Androidの内部プライベートストレージへの書き込み

アプリの一部のデータを、内部のプライベートストレージ領域(アプリのユーザー設定)のシンプルなテキストファイルに保存しようとしています。私はここ(StackOverflow)で多くの質問を読み、提案された解決策を試しましたが成功しませんでした。最も簡単な解決策は、ここで提案されているもののようです:

http://developer.Android.com/guide/topics/data/data-storage.html#filesInternal

しかし、これをテストデバイスで動作させることはできません。また、Java.io.Fileで利用可能なメソッドと適切なメソッドを使用してファイルを作成しようとしました。私も同じ結果でSDカードにファイルを作成しようとしましたが、失敗します。他の回答に記載されている多くの解決策を試しましたが、コードと指示に正確に従って、同じ結果を見つけました。私はいくつかの重要なコードが欠けている、またはどこかにフラグを設定していないと感じ始めています。マニフェストファイルにアクセス許可を設定しました。

  <uses-permission 
        Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />


明確にするために、私はデバイスの内部のプライベートストレージに書き込もうとしています。これは、名前、電話番号、およびいくつかのタイプintフラグを含む小さなファイルです。どの方法を使用しても、ファイルが作成されなかった(またはSDCardに手動でファイルを配置した場合は変更された)か、ファイルまたはファイルの場所を参照しようとするとNullPointerExceptionが発生します。

private              File   fILE = new File("Mydata", main.FILENAME);

または

private              File   fILE  = getDir("Mydata", 0);


HTC Heroでコードを実行しています。Sprintの最新のサービスリリースで更新されています。どんな助けでも大いに感謝されます、事前に感謝します!

-スティーブ

更新(2/2/11):EVO(API 8)を使用しても、NullPointerExceptionが発生します。例外を生成するコードは次のとおりです。アプリが内部ストレージにアクセスできない理由についての考えはありますか? 2つのAPIレベル(API 7および8)を使用する3つの異なる物理デバイスでこの問題が発生します。

    File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

更新2:2/4/11-どのような状況でも物理デバイス(データディレクトリ)のファイル構造を表示できないことがわかりました。誰かこれについて何か考えがありますか?デバイスは適切に構成されており、Eclipseまたはadbからアプリを実行できます。

更新3:(2/9/11)-私はここで問題が何であるかを見つけたと思いますが、それをどのように処理するかはわかりません。物理デバイスの/ data /ディレクトリの権限はdrwxrwx--xであることがわかりました。なぜそれがこのようになっているか、スプリントと何か関係があるのでしょうか?私はこのセットをHTC Hero、Samsung Epic(Galaxy S)、およびHTC EVOのすべてでSprintにこの方法で見つけました。問題は、DDMSと私のアプリがディレクトリへのr/wアクセスを持たないことです。私はここで2つのことを理解する必要があります。なぜこれがこのようなものであり、どうやってこの問題を自然に解決するのかです。繰り返しますが、ここでのどんな助けも素晴らしいです!

更新4:去年の2月は私にとって完全に金髪の瞬間だったと思います(更新3を参照)。私が持っているテストデバイスはROOTされていないため、アクセスできません(DUH!)。彼のSGSとEVO 4Gが行ったすべての更新後、結果は同じです。私はまだこの問題に取り組んでおり、すぐにアップデートでここに戻ってきます(できれば次回は1年未満です)。

13
Kingsolmn

あなたの質問への直接の回答ではありませんが、それでもなお、大量のデータをファイルに保存したくないことに気づきました。代わりに共有設定を使用するのに十分な選択肢でしょうか?

そしてさらにもっと興味深いかもしれません:代わりに共有設定ファイルに書き込んでも問題は発生しますか?

http://developer.Android.com/guide/topics/data/data-storage.html#pref

3
dbm

次の行を変更してみてください:

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

に:

File newfile = new File(this.getFilesDir() + "/","sample.txt");
5
Panoli

物理デバイスの/data/ディレクトリは、rootユーザーのみが使用できます。物理デバイスでこのアクセス権を取得する唯一の現実的な方法はデバイスをルート化することであるため、DDMSファイルエクスプローラーはディレクトリツリーのこのブランチにアクセスできません。

アプリがそこに書き込まない理由については、デバッグキーでアプリに署名したことが原因である可能性があります(* NIXのエキスパートではありませんが、私の個人的な調査ではそうです)。

4
Kingsolmn

私は同じ問題を扱っていました。最後に、内部ストレージに新しいファイルを作成するために、すべてのファイルパスを指定する必要がないことがわかりました。ファイル名を指定するだけで、デバイスのアプリのパッケージフォルダーの下に作成されます。私は正確に述べました ここ

そして、それは完全に機能します。ファイルを作成するために、/ data/...のような完全なファイルパスについては触れないようにします(そのような方法でファイルを作成するには、適切なアクセス許可が必要です)。 Androidフレームワークにアプリのプライベートファイルを作成する仕事を任せましょう。

4
bianca

@biancaが言うように、ファイルパスを使用しない方がよいでしょう。ただし、代わりに、ファイル名のみを使用してファイルを作成します。このようなもの:

public static void saveTextToFile(Context context, String filename, String content) {
  try {
     FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
     fos.write(content.getBytes());
     fos.close();
  } catch (Exception e) {
     e.printStackTrace();
  }
}

そして、ファイルを取得するには、以下を使用できます。

File file = new File(context.getFilesDir(), filename);

詳細: ファイルの保存

内部ストレージ領域は、アプリケーションに対して一種のプライベートであるため、ユーザーがファイルを作成してロードするには、ルートアクセス(ルートデバイス)が必要です。ルート権限を取得したデバイスがある場合、これは内部ストレージにファイルを書き込む方法です。

 // Create a file in the Internal Storage

String fileName = "MyFile";
String content = "hello world";

FileOutputStream outputStream = null;
try {
outputStream = openFileOutput(fileName, Context.MODE_APPEND);
outputStream.write(content.getBytes());
outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

これにより、コンテンツhello worldが付いたMyFileというファイルがすぐに作成されます。内部ストレージディレクトリは通常、アプリのパッケージ名で指定された特別な場所にあります。私の場合、それは/ data/data/[package name]であり、作成されたファイルはそのディレクトリ内のfilesというディレクトリに保存されます。

2
Akash