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:
- Cómo obtener los nombres de archivo almacenados en la tarjeta sd en android
- Notificación de eliminación de SDcard, cómo se hace? ¿Difusión o servicio?
- ¿Cómo puedo recuperar el número de serie de una tarjeta SD en Android 7.0+?
- Android: almacenamiento de imágenes descargadas desde la Web
- org.openqa.selenium.WebDriverException: No se puede crear el directorio temporal: / sd card / 1339054625829.
<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:)
- Almacenar imagen de mapa de bits en tarjeta SD en Android
- ¿Cómo mostrar archivos en la tarjeta SD en un ListView?
- Servidor FTP de Android
- ¿Es posible mover el DB interno a la tarjeta SD?
- ¿Dónde almacena el emulador de Android los archivos de la tarjeta SD?
- Obtener imágenes de la tarjeta SD - android
- Obtener directorio sdcard por adb
- Buscar una ubicación de tarjeta SD externa
¿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