0

みんな。Androidで画像をSDカードの公開画像ディレクトリに保存しようとしています。しかし、書き込み用のファイルを開くことまではうまくいかないようです。コードは次のとおりです。

                boolean mExternalStorageWriteable = false;
            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state)) {

               mExternalStorageWriteable = true;
            } 

            if(mExternalStorageWriteable){
                    File root_dir = Environment.getExternalStorageDirectory();
                    root_dir.mkdirs();
                    File pictures_directory = new File(root_dir, "/Pictures/");
                    pictures_directory.mkdirs();
                    File outputfile = new File(pictures_directory, "test_file.jpg");
                    try {
                        outputfile.createNewFile();
                        FileOutputStream out = new FileOutputStream(outputfile);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            }



私のデバッガーは常にcatchブロックにジャンプし(createNewFile呼び出しによって引き起こされます)、IOExceptionsメッセージは「ディレクトリではありません」です。createNewFile呼び出しを削除すると、FileOutPutStreamコンストラクターはFileNotFound例外をスローします。ただし、ファイルシステムのルートまたはpicturesディレクトリへのfileoutputストリームを開くと、正常に機能するようです。

明らかなことを省くために、私のマニフェストには<uses-permission android:name ="android.permission.WRITE_EXTERNAL_STORAGE"/>タグが含まれています。APIレベル5を使用していて、エミュレーターに仮想SDカードがマウントされています。どんな提案でも大歓迎です。

解決済み:エミュレータファイルシステムに問題がありました。DDMSは、何らかの理由で/Pictures/がファイルまたはディレクトリとして作成されていることを示しました。新しいエミュレータを作成すると、問題が解決しました。

4

3 に答える 3

3

これは通常、ハードコーダーパスセパレーターにとって悪い方法です。Picturesの代わりに試してください/Pictures/。最後のパスは、ルート内のフォルダーを指す絶対パスです。

File pictures_directory = new File(root_dir, "Pictures");

UPD:

コードスニペットをコンパイルして実行しましたが、問題はありません。したがって、問題はエミュレータファイルシステムにあります。最初にそのPicturesファイルを削除するか、エミュレーター用の新しいsdcardイメージを作成してみてください。

于 2011-03-30T03:15:50.027 に答える
0

この方法を試してください。res/drawableディレクトリにtest_file.jpgがあることを確認してください。

    private void writeToSDCard() {
    try {
        File root = Environment.getExternalStorageDirectory();

        if (root.canWrite()){
            InputStream from = getBaseContext().getResources().openRawResource(R.drawable.test_file);
            File dir = new java.io.File (root, "Pictures");
            dir.mkdir();
            File writeTo = new File(root, "Pictures/test_file.jpg");
            FileOutputStream  to = new FileOutputStream(writeTo);

            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = from.read(buffer)) != -1)
                to.write(buffer, 0, bytesRead); // write
            to.close();             
            from.close();
        } else {
            Log.d("MyActivity", "Unable to access SD card.");
        }
    } catch (Exception e) {
        Log.d("MyActivity", "writeToSDCard: " + e.getMessage());
    }
}   "
于 2011-03-30T03:23:53.617 に答える
0

次の2つの方法を混乱させます。

File(String Path)File(File dir, String name)

そのため、pictures_directoryは、完全なパス+ファイル名ではなくディレクトリである必要があります。

変更してみてください

File pictures_directory = new File(root_dir, "/Pictures/");

File pictures_directory = new File(root_dir + "/Pictures/");
于 2011-03-30T03:14:02.010 に答える