Android: copie los activos en el almacenamiento interno

¡Buen día!

Acabo de comenzar a desarrollar para Android. En mi aplicación, necesito copiar los elementos en mi carpeta de activos al almacenamiento interno.

He buscado mucho en SO, incluido esto, que lo copia en el almacenamiento externo. ¿Cómo copiar archivos de la carpeta ‘assets’ a sdcard?

Esto es lo que quiero lograr: tengo un directorio ya presente en el almacenamiento interno como X> Y> Z. Necesito que se copie un archivo en Y y otro en Z.

¿Alguien puede ayudarme con un fragmento de código? Realmente no tengo ni idea de cómo continuar con esto.

Perdón por mi mal ingles.

Muchas gracias.

Utilizar

String out= Environment.getExternalStorageDirectory().getAbsolutePath() + "/X/Y/Z/" ; File outFile = new File(out, Filename); 

Después de editar en tu ref. Respuesta de enlace.

  private void copyAssets() { AssetManager assetManager = getAssets(); String[] files = null; try { files = assetManager.list(""); } catch (IOException e) { Log.e("tag", "Failed to get asset file list.", e); } for(String filename : files) { InputStream in = null; OutputStream out = null; try { in = assetManager.open(filename); String outDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/X/Y/Z/" ; File outFile = new File(outDir, filename); out = new FileOutputStream(outFile); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch(IOException e) { Log.e("tag", "Failed to copy asset file: " + filename, e); } } } private void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while((read = in.read(buffer)) != -1){ out.write(buffer, 0, read); } } 

Hola chicos, hice algo como esto. Que le permite copiar toda la estructura de directorios para copiar desde Android AssetManager 🙂

 public String copyDirorfileFromAssetManager(String arg_assetDir, String arg_destinationDir) throws IOException { File sd_path = Environment.getExternalStorageDirectory(); String dest_dir_path = sd_path + addLeadingSlash(arg_destinationDir); File dest_dir = new File(dest_dir_path); createDir(dest_dir); AssetManager asset_manager = getApplicationContext().getAssets(); String[] files = asset_manager.list(arg_assetDir); for (int i = 0; i < files.length; i++) { String abs_asset_file_path = addTrailingSlash(arg_assetDir) + files[i]; String sub_files[] = asset_manager.list(abs_asset_file_path); if (sub_files.length == 0) { // It is a file String dest_file_path = addTrailingSlash(dest_dir_path) + files[i]; copyAssetFile(abs_asset_file_path, dest_file_path); } else { // It is a sub directory copyDirorfileFromAssetManager(abs_asset_file_path, addTrailingSlash(arg_destinationDir) + files[i]); } } return dest_dir_path; } public void copyAssetFile(String assetFilePath, String destinationFilePath) throws IOException { InputStream in = getApplicationContext().getAssets().open(assetFilePath); OutputStream out = new FileOutputStream(destinationFilePath); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) out.write(buf, 0, len); in.close(); out.close(); } public String addTrailingSlash(String path) { if (path.charAt(path.length() - 1) != '/') { path += "/"; } return path; } public String addLeadingSlash(String path) { if (path.charAt(0) != '/') { path = "/" + path; } return path; } public void createDir(File dir) throws IOException { if (dir.exists()) { if (!dir.isDirectory()) { throw new IOException("Can't create directory, a file is in the way"); } } else { dir.mkdirs(); if (!dir.isDirectory()) { throw new IOException("Unable to create directory"); } } } 

prueba este código a continuación

 private void copyAssets() { AssetManager assetManager = getAssets(); String[] files = null; try { files = assetManager.list(""); } catch (IOException e) { Log.e("tag", "Failed to get asset file list.", e); } for(String filename : files) { InputStream in = null; OutputStream out = null; try { in = assetManager.open(filename); File outFile = new File(getExternalFilesDir(null), filename); out = new FileOutputStream(outFile); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch(IOException e) { Log.e("tag", "Failed to copy asset file: " + filename, e); } } } private void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while((read = in.read(buffer)) != -1){ out.write(buffer, 0, read); } } 
 public void addFilesToSystem(String sysName, String intFil, Context c){ //sysName is the name of the file we have in the android os //intFil is the name of the internal file file = new File(path, sysName + ".txt"); if(!file.exists()){ path.mkdirs(); try { AssetManager am = c.getAssets(); InputStream is = am.open(intFil); OutputStream os = new FileOutputStream(file); byte[] data = new byte[is.available()]; is.read(data); os.write(data); is.close(); os.close(); Toast t = Toast.makeText(c, "Making file: " + file.getName() + ". One time action", Toast.LENGTH_LONG); t.show(); //Update files for the user to use MediaScannerConnection.scanFile(c, new String[] {file.toString()}, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { // TODO Auto-generated method stub } }); } catch (IOException e) { Toast t = Toast.makeText(c, "Error: " + e.toString() + ". One time action", Toast.LENGTH_LONG); t.show(); e.printStackTrace(); } } } 

Para agregar un archivo, llame a addFilesToSystem (“this_file_is_in_the_public_system”, “this_file_is_in_the_assets_folder”, contexto / este contexto es si no tiene el método en la Actividad /

Espero eso ayude

Puede usar el método Envrionment # getDataDirectory para eso. Dará la ruta del directorio de datos de la memoria de almacenamiento interna. Por lo general, se almacenan todos los datos relacionados con la aplicación.

Alternativamente, si desea almacenar en el directorio raíz, puede usar el método Environment # getRootDirectory para eso.

Mi pequeña solución en Kotlin, para copiar datos desde activos a ALMACENAMIENTO INTERNO

 fun copy() { val bufferSize = 1024 val assetManager = context.assets val assetFiles = assetManager.list("") assetFiles.forEach { val inputStream = assetManager.open(it) val outputStream = FileOutputStream(File(context.filesDir, it)) try { inputStream.copyTo(outputStream, bufferSize) } finally { inputStream.close() outputStream.flush() outputStream.close() } } }