2012-06-07 14 views

Respuesta

5

Esto es lo que hice:

copiar su archivo activo en tarjeta SD:

AssetManager assetManager = context.getResources().getAssets(); 

String[] files = null; 

try { 
    files = assetManager.list("ringtone"); //ringtone is folder name 
} catch (Exception e) { 
    Log.e(LOG_TAG, "ERROR: " + e.toString()); 
} 

for (int i = 0; i < files.length; i++) { 
    InputStream in = null; 
    OutputStream out = null; 
    try { 
     in = assetManager.open("ringtone/" + files[i]); 
     out = new FileOutputStream(basepath + "/ringtone/" + files[i]); 

     byte[] buffer = new byte[65536 * 2]; 
     int read; 
     while ((read = in.read(buffer)) != -1) { 
      out.write(buffer, 0, read); 
     } 
     in.close(); 
     in = null; 
     out.flush(); 
     out.close(); 
     out = null; 
     Log.d(LOG_TAG, "Ringtone File Copied in SD Card"); 
    } catch (Exception e) { 
     Log.e(LOG_TAG, "ERROR: " + e.toString()); 
    } 
} 

A continuación, lea el archivo de la ruta:

File ringFile = new File(Environment.getExternalStorageDirectory().toString() + "/ringtone", "fileName.mp3"); 

Hay que ir. Usted tiene una copia del objeto de archivo de su archivo de activos. Espero que esto ayude.

+0

Me estoy quedando sin memoria en mi aplicación si me gusta esto. – Pavandroid

+0

Esto está funcionando para mí. Omití una parte. Cree la carpeta utilizando el método mkdirs() del objeto de archivo antes de este código. Puedes googlearlo – drulabs

+0

Se está agotando la excepción de memoria para @ vipul y mis soluciones ... puede pegar las entradas de logcat. algo no está bien. estás probando en dispositivo o emulador? – drulabs

0

No estoy al tanto de cualquier manera de obtener una File objeto real, pero si se puede trabajar con un FileDescriptor, se puede hacer:

FileDescriptor fd = getAssets().openFd(assetFileName).getFileDescriptor(); 
+2

No sé de qué manera se puede utilizar esto. ¿Puedes explicar el uso de este descriptor? – Pavandroid

4

para leer archivos en bruto en Archivo.

InputStream ins = getResources().openRawResource(R.raw.my_db_file); 
    ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); 
    int size = 0; 
    // Read the entire resource into a local byte buffer. 
    byte[] buffer = new byte[1024]; 
    while((size=ins.read(buffer,0,1024))>=0){ 
     outputStream.write(buffer,0,size); 
    } 
    ins.close(); 
    buffer=outputStream.toByteArray(); 

    FileOutputStream fos = new FileOutputStream("mycopy.db"); 
    fos.write(buffer); 
    fos.close(); 

Para evitar OutOfMemory aplica siguiente lógica.

No cree un gran ByteBuffer que contenga TODOS los datos a la vez. Cree un ByteBuffer mucho más pequeño, llénelo con datos, luego escriba estos datos en el FileChannel. Luego reinicie ByteBuffer y continúe hasta que se escriban todos los datos.

+0

Me sale de memoria en mi aplicación si me gusta esto. – Pavandroid

+0

ver respuesta actualizada –

+0

Gracias por la solución. +1 para ti. Aclamaciones. –

Cuestiones relacionadas