2010-03-16 35 views
18

Estoy tratando de escribir un archivo desde una respuesta de Http post a un archivo en la sdcard. Todo funciona bien hasta que se recupera la matriz de bytes de datos.Escribiendo un archivo en una tarjeta SD

He intentado configurar el permiso WRITE_EXTERNAL_STORAGE en el manifiesto y probé muchas combinaciones diferentes de tutoriales que encontré en la red.

Todo lo que pude encontrar fue el uso del método openFileOutput("",MODE_WORLD_READABLE), pero la forma en que mi aplicación escribe el archivo es mediante el uso de un hilo. Específicamente, se invoca un subproceso desde otro subproceso cuando se debe escribir un archivo, , por lo que no funcionó dar un objeto de actividad aunque lo probé.

La aplicación ha recorrido un largo camino y no puedo cambiar la forma en que se escribe actualmente la aplicación.

Por favor, ¿alguien me ayude?


CÓDIGO:

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 mantiene unido al camino archivos. seReply es una respuesta de cadena desde la respuesta HttpPost. El segundo conjunto de código se enlaza con referencia a x. El archivo se crea pero permanece en 0 bytes.

Respuesta

20

El método openFileOutput() escribe datos en el área de datos privados de su aplicación (no en la tarjeta SD), por lo que probablemente no sea lo que quiere. Debería poder llamar al Environment.getExternalStorageDirectory() para obtener la ruta de acceso raíz a la tarjeta SD y usarla para crear un FileOutputStream. A partir de ahí, solo use las rutinas java.io estándar.

+0

Gracias Erich. Estoy pasando la ruta completa como una cadena como esta "/sdcard/filename.ext". también se creó el archivo pero el tamaño del archivo sigue siendo de 0 bytes. Además, no puedo usar los controles de archivos push/pull del DDMS en eclipse. –

+0

Es posible que deba publicar algo de su código de escritura de archivo para ayudar a diagnosticar el problema. No todo, pero al menos lo básico de lo que está pasando. Además, ¿ves algún mensaje en LogCat? –

+0

Erich, he actualizado el código. no se crean mensajes sobre operaciones de archivos en LogCat. Cambié el código mucho tiempo porque recibí errores en algunos códigos, pero no recuerdo qué código me dio errores. –

3

Este es un ejemplo:

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

Junto con esto Escribid este permiso EN Android.Manifest

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

eso es lo que llamamos la vista de un programador –

+0

aquí en lugar de edittext me gustaría pasar dos valores de cadena y almacenarlos en un archivo en sdcard. ¿Cómo puedo lograr eso? – AndroidOptimist

+0

@Alliswell Siga este enlace, espero que obtenga su solución http://stackoverflow.com/questions/9962896/store-data-text-to-sd-card-in-android –

Cuestiones relacionadas