No se puede escribir el archivo de texto en la tarjeta SD

Tengo un problema extraño que he encontrado Mi aplicación puede escribir un archivo de texto simple en la tarjeta SD y algunas veces funciona para algunas personas pero no para otras, y no tengo idea de por qué.

Para algunas personas, la fuerza se cierra si ponen algunos caracteres como ... en el Archivo y tal. Parece que no puedo reproducirlo ya que no tuve problemas, pero este es el código que maneja la escritura de archivos. ¿Alguien puede pensar en algo que pueda ocasionar problemas o una mejor forma de hacerlo?

 public void generateNoteOnSD(String sFileName, String sBody) { try { File root = new File(Environment.getExternalStorageDirectory(), "Notes"); if (!root.exists()) { root.mkdirs(); } File gpxfile = new File(root, sFileName); FileWriter writer = new FileWriter(gpxfile); writer.append(sBody); writer.flush(); writer.close(); Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show(); } catch(IOException e) { e.printStackTrace(); importError = e.getMessage(); iError(); } } 

Puede usar este método para verificar el estado de sdCard. Cambie el diálogo de brindis por su idioma:

** Atención con MEDIA_MOUNTED_READ_ONLY. No es necesario escribir en la tarjeta SD y devuelvo la verdad **

 public static Boolean comprobarSDCard(Context mContext) { String auxSDCardStatus = Environment.getExternalStorageState(); if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED)) return true; else if (auxSDCardStatus.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { Toast.makeText( mContext, "Warning, the SDCard it's only in read mode.\nthis does not result in malfunction" + " of the read aplication", Toast.LENGTH_LONG) .show(); return true; } else if (auxSDCardStatus.equals(Environment.MEDIA_NOFS)) { Toast.makeText( mContext, "Error, the SDCard can be used, it has not a corret format or " + "is not formated.", Toast.LENGTH_LONG) .show(); return false; } else if (auxSDCardStatus.equals(Environment.MEDIA_REMOVED)) { Toast.makeText( mContext, "Error, the SDCard is not found, to use the reader you need " + "insert a SDCard on the device.", Toast.LENGTH_LONG).show(); return false; } else if (auxSDCardStatus.equals(Environment.MEDIA_SHARED)) { Toast.makeText( mContext, "Error, the SDCard is not mounted beacuse is using " + "connected by USB. Plug out and try again.", Toast.LENGTH_LONG).show(); return false; } else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTABLE)) { Toast.makeText( mContext, "Error, the SDCard cant be mounted.\nThe may be happend when the SDCard is corrupted " + "or crashed.", Toast.LENGTH_LONG).show(); return false; } else if (auxSDCardStatus.equals(Environment.MEDIA_UNMOUNTED)) { Toast.makeText( mContext, "Error, the SDCArd is on the device but is not mounted." + "Mount it before use the app.", Toast.LENGTH_LONG).show(); return false; } return true; } 

¿Está revisando que el almacenamiento externo sea grabable? Si no, intenta usar …

 Environment.getExternalStorageState() 

Esto le dirá si la tarjeta SD está montada y también puede verificar si es grabable. Eso es todo lo que se me ocurre sugerir en este punto.

Acabo de descubrir que en mi caso, me falta agregar en el archivo Manifest.

Aclamaciones,

wahib

Para todos los novatos que están depurando en un dispositivo real a través de USB: no olvide desconectar el cable USB de su PC de desarrollo, como yo lo hice. Cuando el USB está conectado, la tarjeta SD no está disponible. Feliz archivo de escritura …

Esto no es correcto en todas las construcciones de teléfonos / ROM. Las ROM de CMod7 y MIUI le permiten configurar si la tarjeta SD está montada o no cuando se conecta a la PC. Dependiendo de su configuración, lo anterior puede ser cierto. Lo mejor es verificar

Usualmente utilizo PrintWriter en lugar de FileWriter. No sé si resolvería su problema, pero es de un nivel más alto, por lo que puede ocuparse de más cosas que un simple FileWriter.