web-dev-qa-db-ja.com

SDカードにファイルを書き込む

sdcard上のファイルへのHttp投稿返信からファイルを書き込もうとしています。データのバイト配列が取得されるまで、すべてが正常に機能します。

私はマニフェストで_WRITE_EXTERNAL_STORAGE_権限を設定しようとし、ネットで見つけたチュートリアルのさまざまな組み合わせを試しました。

私が見つけることができたのは、アクティビティのopenFileOutput("",MODE_WORLD_READABLE)メソッドを使用することだけでしたが、私のアプリがファイルを書き込む方法は、スレッドを使用することです。具体的には、ファイルを書き込む必要があるときに別のスレッドからスレッドが呼び出されるため、試してもアクティビティオブジェクトを指定できませんでした。

アプリは長い道のりを歩んでおり、アプリの現在の記述方法を変更することはできません。

誰か助けてください


[〜#〜]コード[〜#〜]

_File file = new File(bgdmanip.savLocation);
FileOutputStream filecon = null;
filecon = new FileOutputStream(file);

byte[] myByte;
myByte = Base64Coder.decode(seReply);

bos.write(myByte);
filecon.write(myByte);
myvals = x * 11024;
_

_bgdmanip.savLocation_はファイルパス全体を保持します。 seReplyは、HttpPost応答からの文字列応答です。 2番目のコードセットは、xを参照してループされます。ファイルは作成されますが、0バイトのままです。

20
Sumit M Asok

openFileOutput()メソッドは、アプリケーションのプライベートデータ領域(SDカードではない)にデータを書き込むため、これはおそらく望ましいことではありません。 Environment.getExternalStorageDirectory()を呼び出してSDカードへのルートパスを取得し、それを使用してFileOutputStreamを作成できるはずです。そこから、標準のJava.ioルーチンを使用します。

22
Erich Douglass
//------------------------------WRITING DATA TO THE FILE ---------------------------------      

btnWriteSDFile.setOnClickListener(new OnClickListener() 
    {
    public void onClick(View v)
    {       

        try {
            File myFile = new File("/sdcard/mysdfile.txt");
            myFile.createNewFile();
            FileOutputStream fOut = new FileOutputStream(myFile);
            OutputStreamWriter myOutWriter =new OutputStreamWriter(fOut);
            myOutWriter.append(txtData.getText());
            myOutWriter.close();
            fOut.close();
            Toast.makeText(v.getContext(),"Done writing SD 'mysdfile.txt'", Toast.LENGTH_SHORT).show();
            txtData.setText("");
        } 
        catch (Exception e) 
        {
            Toast.makeText(v.getContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
        }
    }


    }); 

//---------------------------READING DATA FROM THE FILE PLACED IN SDCARD-------------------//       
        btnReadSDFile.setOnClickListener(new OnClickListener()
        {

        public void onClick(View v) 
        {

        try {

            File myFile = new File("/sdcard/mysdfile.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            while ((aDataRow = myReader.readLine()) != null) 
            {
                aBuffer += aDataRow ;
            }
            txtData.setText(aBuffer);
            myReader.close();
            Toast.makeText(v.getContext(),"Done reading SD 'mysdfile.txt'",Toast.LENGTH_SHORT).show();
        } 
        catch (Exception e)
        {
            Toast.makeText(v.getContext(), e.getMessage(),Toast.LENGTH_SHORT).show();
        }
        }
        }); 

これに沿って、この許可をAndroid.Manifestに書き込みます

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
28
Pir Fahim Shah

ここにサンプルがあります:

// Log used as debug
File log = new File(Environment.getExternalStorageDirectory(), "Log.txt");
try {
    out = new BufferedWriter(new FileWriter(log.getAbsolutePath(), false));
    out.write(new Date().toString());
    out.write(" : \n");
} catch (Exception e) {
    Log.e(TAG, "Error opening Log.", e);
}
3
gtangil