Stack Overflow en español Asked by Fernando Delgado Fernandez on December 9, 2021
Hola tengo una app que funciona bien en un Xiaomi Redmi 7 y Xiaomi Mi A1.
Pero al instalarla en un nuevo telefono que he adquirido un Xiaomi Redmi Note 9 hay una parte que ha dejado de funcioanar.
Cuando intento crear una copia de seguridad, lo realizo creando una carpeta llamada "laquesea" con un subdirectoria "Copia" y ahi dentro grabo la base de dato *.db. Pero con este nuevo telefono ni se crea la carpeta y ademas tambien no crea los pdf de otra parte de la app.
Me he dado cuenta que al crear la copia de seguridad en el codigo al llegar al if (pathdestino.canWrite()) { no lo hace, no entra por lo cual no crea nada
¿Por que puede ser?
@RequiresApi(api = Build.VERSION_CODES.N)
public void copiaDatabase(){
try {
String DBName = "tesoreria.db";
File pathdestino = Environment.getExternalStorageDirectory();
File pathorigen = getActivity().getDatabasePath(DBName);
if (pathdestino.canWrite()) {
String destinoPath = Environment.getExternalStorageDirectory().toString();
File directorio = new File(destinoPath + File.separator + CARPETA);
if (!directorio.exists()) { directorio.mkdir(); }
File subdirectorio = new File(directorio + File.separator + SUBCARPETA);
if (!subdirectorio.exists()) { subdirectorio.mkdir(); }
String origenDBPath = pathorigen.toString();
String destinoDBPath = Environment.getExternalStorageDirectory() + File.separator + CARPETA + File.separator + SUBCARPETA + File.separator + DBName;
File destinofichero = new File( destinoDBPath );
if (!destinofichero.exists()) { destinofichero.delete(); }
File origenDB = new File(origenDBPath);
File destinoDB = new File(destinoDBPath);
FileChannel origen = new FileInputStream(origenDB).getChannel();
FileChannel destino = new FileOutputStream(destinoDB).getChannel();
destino.transferFrom(origen, 0, origen.size());
origen.close();
destino.close();
}
} catch (Exception e) {
AlertDialog.Builder alertDialogCopiaError = new AlertDialog.Builder(getActivity());
alertDialogCopiaError.setMessage("No se pudo realizar la Copia de Seguridad. Intentelo más tarde.")
.setTitle("ERROR Copia de Seguridad")
.setIcon(R.drawable.apoyo24)
.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
});
alertDialogCopiaError.show();
}
}
SOLUCIONADO
Despues de darle un monton de vueltas para Android 10 y API 29 para poder acceder a los documentos publicos a si como crear directorios sed debe de poner en el AndroisManifest.xml en la parte de < Aplicacion .... esto
android:requestLegacyExternalStorage="true"
Answered by Fernando Delgado Fernandez on December 9, 2021
Hay dos razones que provocan lo que comentas cuando llamas el metodo canWrite()
El archivo no existe, retornara false.
No tienes permisos WRITE_EXTERNAL_STORAGE, retornara false
Suponiendo que tienes los permisos asignados a tu aplicacion.
En este caso la estructura de archivos puede variar entre versiones y entre dispositivos, por esta razon deberias obtener el path origen a partir del nombre de la Base de datos y su ruta, de esta forma:
//String DBName = "tesoreria.db";
//File pathorigen = getActivity().getDatabasePath(DBName);
//Obtiene ruta de base de datos origen.
String DBName = "tesoreria.db";
String pathDB = getDatabasePath(DBName).toString();
File pathorigen = new File(pathDB);
Si deseas copiar una base de datos, puedes revisar esta respuesta:
¿Como copiar una base de datos Sqlite o archivo desde el almacenamiento interno al externo?
Answered by Elenasys on December 9, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP