Я пытаюсь написать файл из ответа на сообщение Http в файл на SD-карте . Все работает нормально, пока массив байтов данных не будет восстановлен.
Я попытался установить разрешение 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
. Второй набор кода зацикливается со ссылкой на x
. Файл создается, но остается 0 байтов.
Метод openFileOutput()
записывает данные в область личных данных вашего приложения (а не SD-карту), поэтому, вероятно, это не то, что вы хотите. Вы должны иметь возможность вызвать Environment.getExternalStorageDirectory()
чтобы получить корневой путь к SD-карте и использовать его для создания FileOutputStream
. Оттуда просто используйте стандартные java.io-процедуры.
//------------------------------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" />
Вот пример:
// 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); }