2011-01-20 21 views
9

私のアプリからのデータを、内部のプライベートストレージエリア(アプリのユーザー設定)のシンプルなテキストファイルに保存しようとしています。私はここで多くの質問(StackOverflow)を読んで、成功しなかった解決策を試しました。一番簡単な解決法は、ここに示唆された解決策です:

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

しかし、私はこれを私のテストデバイスで動作させることはできません。また、適切なメソッドでjava.io.Fileで使用できるメソッドを使用してファイルを作成しようとしました。私は同じ結果をSDCard上に作成しようとしましたが、失敗しました。私は他の答えに列挙された多くのソリューションを試してみました。コードと指示が正確に示唆され、同じ結果が得られました。私はどこかのコードのいくつかの重要なビット、または設定フラグをしないのです、私はマニフェストファイルにアクセス権を設定していることを感じ始めています:明確にするため

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

<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のヒーローでコードを実行しています。どんな助けでも大いに感謝されます、ありがとうございます!

-Steve

アップデート(2/2/11):EVO(API 8)を使用して、私はまだNullPointerExceptionが得られます。例外を生成するコードは、私のアプリが内部ストレージにアクセスできない理由についての考えです。私は、2つのAPIレベル(API 7と8)を使用する3つの異なる物理デバイスでこの問題を抱えています。

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

UPDATE 2:2/4/11 - 私はどのような状況の下で、物理デバイス(データディレクトリ)上のファイル構造を見ることができないことを見出しました。誰にでもこれに関する考えはありますか?デバイスは適切に設定されており、eclipseまたはadbからappを実行できます。

UPDATE 3:(2/9/11) - 私はこの問題が何であるかを知っているかもしれないと思うが、それに対処する方法がわからない。私は、物理デバイスの/ data /ディレクトリのアクセス許可がdrwxrwx--xであることを認識しました。私はなぜそれがこの方法であるかわからない、多分スプリントで何か?私はこれをHTC Hero、Samsung Epic(Galaxy S)、そしてHTC EVOのすべてでSprintで見つけました。この問題は、DDMSと私のアプリケーションがディレクトリへのr/wアクセス権を持っていないことが原因です。私はここで2つのことを理解する必要があります、なぜこれのようなもので、どのように野生のこの問題に来てください。再び、ここのどんな助けも素晴らしいだろう!!

更新日:私は昨年2月が私のために総ブロンドの瞬間だったと思います(更新3参照)。私が持っているテストデバイスはROOTされていないため、アクセスはありません(DUH!)。 SGSとEVO 4Gのすべてのアップデートが終わった後も、結果は変わりません。私はまだこの問題に取り組んでおり、もう一度更新してみようと思っています。

+0

これらの異なる方法を試してみるとエラーメッセージが表示されますか、それとも単に黙って失敗していますか? –

+0

私は 'openFileOutput()'の方法に集中しており、NullPointerExceptionが発生しています。何らかの理由で電話機のプライベートデータディレクトリがロックされているようで、ディレクトリを見ることさえできません。そのような何もそこに作成されません。電話機の 'data'ディレクトリのアクセス権は、「drwxrwx-x」です。私は電話や何かに無効な設定があるかどうか疑問に思っています。互換性のため、データファイルは内部ストレージに書き込む必要があります。 – Kingsolmn

+0

DDMSを使用して物理デバイス上の/ dataディレクトリにアクセスすることはできません。ただし、rootアクセス権がない限り、アプリケーションからファイルに書き込むことはできません。エミュレータではどうなりますか?あなたはファイルを書くことができますか? – techiServices

答えて

3

あなたの質問に直接答えはありませんが、それにもかかわらず、私はあなたのファイルに大量のデータを保存したくないことに気付きました。 Shared Preferencesを代わりに使用するのに十分な代替手段でしょうか?

さらに興味深いのは、共有環境設定ファイルに書き込むときにも問題が発生するのでしょうか?

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

+0

物理デバイス上の/ data /ディレクトリにアクセスすることはできません。私はSharedPreferencesに変更して以来、物理的なデバイス上で私のアプリケーションを実行していないが、私はまだディレクトリを表示することはできません知っている。私はEclipse 3.5の古典的なHTC USBドライバを使用していますが、すべて最新版にアップデートされています。 – Kingsolmn

+0

'SharedPreferences'を使うことは、物理デバイス上で動作します。ここで起こったことについてのアイドル・スペキュレーションのための私の答えを見てください。 @dbm – Kingsolmn

+0

イェーイ! :-)あなたの直接の問題は少なくとも解決されたようです。私が助けることができてうれしいです(緑のチェックマークのおかげで): – dbm

4

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

なぜアプリがそこに書き込まれないのかに関しては、おそらく、私がデバッグキーでアプリに署名したことになる可能性があります(大きな* NIXエキスパートではありませんが、私の個人的な調査)。私は同じ問題を扱った

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

は、次の行を変更してみてください。最後に、内部ストレージに新しいファイルを作成するために、すべてのファイルパスを指定する必要はありません。ファイル名は、デバイスのアプリパッケージフォルダの下に作成されます。私は正確に言及したhere

それは完全に動作します。私は、ファイルの作成のために/ data/...のような完全なファイルパスを言及しないようにします(このような方法でファイルを作成するには正しい権限が必要です)。あなたのアプリ用のプライベートファイルを作成するには、Androidフレームワークを使用しましょう。

+0

Thersは '+"/"'を必要としません。 –

4

:に

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

2

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

// 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(); 
} 

これは即座にコンテンツハロー世界でMyFileのという名前のファイルを作成する必要があります。内部ストレージディレクトリは通常、アプリのパッケージ名で指定された特別な場所にあります。私の場合は/ data/data/[パッケージ名]であり、作成されたファイルはそのディレクトリ内のfilesというディレクトリに保存されます。

0

@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); 

続きを読む:Saving Filesを。