0

Es una aplicación sencilla para escribir contenido. Posee cuatro (04) botones, de los cuales, dos (02) guardan datos y los otros dos (02) cargan datos. De los que que guardan datos, el primero lo hace en la tarjeta SD y el segundo en la memoria interna; mientras que los que cargan datos, el primero lo carga de la tarjeta SD y el segundo de la memoria interna.

En la memoria interna funciona bien, pero el problema se presenta en la memoria externa al darle guardar, por lo tanto, se cierra automáticamente. Es decir, arroja un null pointer exception en el array.

En alguna parte de estos métodos va el error, seguramente cuando se trata de escritura de datos en la tarjeta SD.

public void salvarNotaSD (View v) {
  if (Environment.getExternalStorageState ().equals (Environment.MEDIA_MOUNTED)) {
    if (ContextCompat.checkSelfPermission (this,
        Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
      PackageManager.PERMISSION_GRANTED) {
      if (ActivityCompat.shouldShowRequestPermissionRationale (this,
          Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Toast.makeText (this, "Se necesita acceso de escritura a la SD",
          Toast.LENGTH_SHORT).show ();
      }
      ActivityCompat.requestPermissions (this,
        new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
        REQUEST_WRITE_EXTERNAL_STORAGE);
    } else {
      escribirSD ();
    }
  } else {
    Toast.makeText (this, "La memoria externa no está disponible",
      Toast.LENGTH_SHORT).show ();
  }
}

public void onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) {
  switch (requestCode) {
    case 0:
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
        escribirSD ();
      else
        Toast.makeText (this, "No se ha aceptado el permiso", Toast.LENGTH_SHORT).show ();
      return;
    default:
      super.onRequestPermissionsResult (requestCode, permissions, grantResults);
  }
}

private void escribirSD () {
  String nomArchivo = this.etFichero.getText ().toString ();
  String contenido = this.etEditor.getText ().toString ();
  File memExt = Environment.getExternalStorageDirectory ();
  File file = new File (memExt.getAbsolutePath (), nomArchivo);
  OutputStreamWriter osw = null;
  try {
    osw = new OutputStreamWriter (
      new FileOutputStream (file));
  } catch (FileNotFoundException e) {
    e.printStackTrace ();
  }

  try {
    osw.write (contenido);
  } catch (IOException e) {
    e.printStackTrace ();
  }

  try {
    osw.flush ();
  } catch (IOException e) {
    e.printStackTrace ();
  }

  try {
    osw.close ();
  } catch (IOException e) {
    e.printStackTrace ();
  }

  Toast.makeText (this, "Los datos fueron grabados correctamente en la SD",
    Toast.LENGTH_SHORT).show ();
}

La versión de Android con la que estoy trabajando es la 7.1.1. En caso de presentar dudas me dicen. Así colocaré más detalles.

Esta es la salida de error:

2020-01-27 12:09:07.876 14431-14465/? E/Perf: Fail to get file list com.google.android.apps.turbo
2020-01-27 12:09:07.877 14431-14465/? E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-01-27 12:09:07.877 14431-14465/? E/Perf: Fail to get file list com.google.android.apps.turbo
2020-01-27 12:09:07.877 14431-14465/? E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-01-27 12:09:07.878 14431-14465/? E/Perf: Fail to get file list oat
2020-01-27 12:09:07.878 14431-14465/? E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array
2020-01-27 12:10:22.773 14340-14340/com.example.ej2 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ej2, PID: 14340
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=0, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example.ej2/com.example.ej2.NotasActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.OutputStreamWriter.write(java.lang.String)' on a null object reference
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4867)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4908)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2022)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:359)
        at android.app.ActivityThread.main(ActivityThread.java:7418)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.OutputStreamWriter.write(java.lang.String)' on a null object reference
        at com.example.ej2.NotasActivity.escribirSD(NotasActivity.java:140)
        at com.example.ej2.NotasActivity.onRequestPermissionsResult(NotasActivity.java:118)
        at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8264)
        at android.app.Activity.dispatchActivityResult(Activity.java:8114)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4860)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4908)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2022)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:359)
        at android.app.ActivityThread.main(ActivityThread.java:7418)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
David E. Luna M.
  • 2,687
  • 4
  • 11
  • 28
unknow
  • 1,896
  • 9
  • 35
  • Yo esto no lo entiendo por más que lo leo: _"Es una app sencilla nombre del fichero un mutilinea para escribir el contenido y 4 botones 2 guarda uno en la sd y otro en la interna y 2 cargan uno de la sd y otro de la interna"_. ¿Dónde te da el NullPointerException? ¿Has probado a Depurar? – SuperG280 Jan 27 '20 at 11:03
  • @x3kagainstSEbehavior eso no me soluciona nada, hasta ay tb llego el problema es saber poruqe es nulo que fallo – unknow Jan 27 '20 at 11:07
  • @SuperG280 no se depurar en android studio no me han enseñado, de todas formas el rror viene en el array al escribir en la sd he puesto la salida del logcat – unknow Jan 27 '20 at 11:12
  • Entonces tu pregunta debería de ser "¿Como depurar en android studio?". En esa pregunta que te he enlazado hay un apartado "**¿Y ahora es cuando alguien protesta: "Pero eso no me ayuda con mi problema de que me sale un NullPointerException en mi programa que aquí te escribo1"?**" Leete este apartado. – x3k Jan 27 '20 at 11:15
  • El depurar solo me va decir donde esta el error que yo ya se que es en el array, lo que no se es si es nulo que deberia ser o como debria ser. Soy muuy nuevo en android si fuera java normal seguramente encuentro el problema solo – unknow Jan 27 '20 at 11:17
  • 1
    Depurando podrás ver porqué `osw` es `null`. Si es porque `nomArchivo` no es el que esperabas, o es la obtención de `memExt` o al crear `file`. Y podrás afinar un poco el problema. – SuperG280 Jan 27 '20 at 11:23
  • Para guardar contenido en la memoria sd, tu app de Android debe importar los permisos de guardado. Después, ANTES DE GUARDAR, yo haría un console.log hacía la ruta de la tarjeta Y COMPROBARÍA que realmente es esa. – EduBw Jan 28 '20 at 10:06

0 Answers0