2010-12-28 19 views
11

私は今この間私の髪を引き出しています。次の方法では、ファイルをダウンロードし、ハードドライブに指定された場所に保存することになっています。ファイルmkdirs()メソッドがアンドロイド/ javaで動作しません

private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) { 

    if (!Tools.checkNetworkState(context, backgroundUpdate)) 
     return; 

    // Get the image 
    try { 
     // Make the file 
     file.getParentFile().mkdirs(); 

     // Set up the connection 
     URLConnection uCon = url.openConnection(); 
     InputStream is = uCon.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 

     // Download the data 
     ByteArrayBuffer baf = new ByteArrayBuffer(50); 
     int current = 0; 
     while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
     } 

     // Write the bits to the file 
     OutputStream os = new FileOutputStream(file); 
     os.write(baf.toByteArray()); 
     os.close(); 
    } catch (Exception e) { 
     // Any exception is probably a newtork faiilure, bail 
     return; 
    } 
} 

また、ファイルが存在しない場合、ファイルのディレクトリを作成することになっています。 (そして、すでにその場所に別のファイルがある場合は、何もしないでください)。しかし、何らかの理由で、mkdirs()メソッドは決してディレクトリを作成しません。私は明示的な括弧から明示的に親ファイルクラスを作成するまで、すべてを試しましたが、何も動作しないようです。私は、ドライブが書き込み可能であることはかなり確信しています。それは、それが既に決定された後にのみ呼び出されるため、デバッグ中にドライブを実行した後も同じです。親ディレクトリが作成されていないため、メソッドが失敗します。私はそれを呼んでいる方法に何か悪いことがあれば誰でも教えてもらえますか?それは場合に役立ちます

はまた、ここで私はそれを呼んでいるファイルのソースです:

https://github.com/LeifAndersen/NetCatch/blob/master/src/net/leifandersen/mobile/android/netcatch/services/RSSService.java

答えて

30

あなたはこれを確認してくださいあなたのマニフェスト

+0

私はそれを信じられない、それは働いた。私は今、馬鹿のように感じる。一方で、奇妙なプロジェクトの他のリビジョンを魔法のように修正していました。どうもありがとうございました。 –

3

ありがとう、あなたはmkdirsが失敗していることを確認していますか? falseを返すと、mkdirs呼び出しの戻り値をチェックしてエラーメッセージを記録してみませんか?

if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){ 
    log("Unable to create " + file.getParentFile()); 
} 

私はあなたがファイルが何であったか...

PSと驚くかもしれないと思われる - と、そのエラーハンドラで何かをしてください - 最低でも、エラーを記録。キャッチ例外と静かなリターンを行うことは恐ろしい練習です。

+0

エラーをログに記録することをお勧めします。これは良い考えで、今変更しました。そして、それはファイルを作成することができないと主張している(提案されたようにあなたのエラーを挿入する)。 –

13

android.permission.WRITE_EXTERNAL_STORAGE許可を追加している願って、それはあなたが...

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

マニフェストでTIS許可を入力して助けることが、あなたのSDカードにコンテンツを作成している場合ファイル。

+0

うん、それだよ。 –

5

さらにKevin Dayの返信には、という別のエラーモダリティがありました。以前の投稿には言及していませんでした。あなたがマニフェストにandroid.permission.WRITE_EXTERNAL_STORAGEを持っていても、/mnt/sdcardのようなメディアを外部からUSBガジェットとしてマウントした場合(つまり、USBケーブルを使って外部ディスクとしてデバイスをPCに接続した場合)は書き込みをしようとしているときは、/ mnt/sdcardファイルシステムに書き込むことはできません。この場合、FILE.mkdirはfalseを返します。明らかに、あなたがあなたが作成したと思うディレクトリにファイルを作成しようとすると、IOExceptionが得られるまで、リターンコードをチェックしていなければ、この問題は表示されません。そして、存在しないディレクトリにファイルを作成しないと、アプリケーションは自動的に失敗します。

私はAndroidアプリをデバッグするときに常にこの間違いを犯しています。私は外部からsdcardをマウントすることはできませんし、同時に私のアプリに書き込むこともできません。

関連する問題