Permiso para escribir en la tarjeta SD android

Tengo un problema escribiendo a la tarjeta SD, aquí está el código: (Lo siento sobre el diseño del código, sólo copia pased que)

public class SaveAndReadManager { private String result; private String saveFileName = "eventlist_savefile"; public String writeToFile( ArrayList<Event> arrlEvents ){ FileOutputStream fos = null; ObjectOutputStream out = null; try{ File root = Environment.getExternalStorageDirectory(); if( root.canWrite() ){ fos = new FileOutputStream( saveFileName ); out = new ObjectOutputStream( fos ); out.writeObject( arrlEvents ); result = "File written"; out.close(); }else{ result = "file cant write"; } }catch( IOException e ){ e.printStackTrace(); result = "file not written"; } return result; } public boolean readFromFile(){ return false; } } 

Todavía no he implementado el archivo readFromFile (). El problema es que root.canWrite () devuelve false todo el tiempo. Aquí está el archivo de manifiesto:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".InfoScreen" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> 

  <activity android:name=".EventCalendar" android:label="@string/app_name" /> <activity android:name=".MakeEvent" android:label="@string/app_name" /> <activity android:name=".ViewEvent" android:label="@string/app_name" /> </application> <uses-sdk android:minSdkVersion="8" /> 

He pedido el permiso para escribir, y en mi avd, si voy a la configuración -> tarjeta SD y almacenamiento de teléfono, me dice que tengo 1 GB en la tarjeta sd para escribir. Por favor ayuda.

Gracias:)

¿Qué resultado está viendo retunred de writeToFile? "Archivo no escrito" o "archivo no puede escribir"?

Cuando corrí tu código, se metió en el bloque catch IOException con el resultado de "file not written". La razón de esto era que fos fue definido incorrectamente:

 fos = new FileOutputStream( saveFileName ); 

debiera ser:

 fos = new FileOutputStream( root + "/" saveFileName ); 

Después de cambiar esta línea, obtuve el resultado "Archivo escrito" devuelto de writeToFile.

Intente verificar el estado de la tarjeta SD antes de intentar escribir en ella. Se puede usar como unidad compartida, corrupta, llena, etc. Se puede encontrar una lista de estados aquí: http://developer.android.com/reference/android/os/Environment.html

He aquí un ejemplo de cómo obtener los estados:

 String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { mExternalStorageAvailable = mExternalStorageWriteable = false; } 

Utilizo el siguiente código para grabar datos de audio (con éxito) en la tarjeta SD de mi Android. Mi aplicación requiere el permiso RECORD_AUDIO, pero nada más.

 File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath() + FILE_NAME); if (file.exists()) file.delete(); // Delete any previous recording try { file.createNewFile(); // Create the new file } catch (IOException e) { Log.e (TAG, "Failed to create " + file.toString()); } try { OutputStream os = new FileOutputStream (file); BufferedOutputStream bos = new BufferedOutputStream (os, 8000); DataOutputStream dos = new DataOutputStream (bos); // Create a DataOutputStream to write the audio data to the file // Create an AudioRecord object to record the audio int bufferSize = AudioRecord.getMinBufferSize (frequency, channelConfig, Encoding); AudioRecord audioRecord = new AudioRecord (MediaRecorder.AudioSource.MIC, frequency, channelConfig, Encoding, bufferSize); short[] buffer = new short[bufferSize]; // Using "short", because we're using "ENCODING_PCM_16BIT" audioRecord.startRecording(); while (isRecording) { int bufferReadResult = audioRecord.read (buffer, 0, bufferSize); for (int i = 0; i < bufferReadResult; i++) dos.writeShort (buffer[i]); } audioRecord.stop(); dos.close(); } catch (Exception t) { Log.e (TAG, "Recording Failed"); } 

Me parecería que le falta la llamada getAbsolutePath () anexada a su llamada getExternalStorageDirectory () que puede tener el mismo resultado que la solución codificada de Marc Bernstein.

Debería haber incluido el siguiente enlace también (ya que es donde obtuve el código que escribe en la tarjeta SD …):

http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

  • ¿La desinstalación de una aplicación android borra la base de datos almacenada en sdcard?
  • Cómo acceder a archivos de vídeo de la carpeta de tarjetas SD en la aplicación de Android
  • ¿Por qué no se puede escribir en mi tarjeta SD (Android)?
  • No se puede mover una aplicación a la tarjeta SD
  • Puede cargar dll android de sdcard en modo nativo
  • ¿Cómo usar SQLiteOpenHelper con la base de datos en sd-card?
  • Android Eliminar imagen de la tarjeta SD con OnClick
  • Que muestra la imagen de sdcard con webview no funciona
  • Cómo leer un archivo directamente desde un archivo .zip sin extraerlo en android
  • Cómo crear una carpeta en sdcard en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.