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)