¿Cuál es el uso de MemoryFile en android
Quiero escribir algunos bytes en una memoria compartida. Esto se hace en mi aplicación1. Desde mi otra aplicación: application2 Quiero acceder a esa memoria compartida para leer los bytes escritos. Para este propósito he intentado usar la clase MemoryFile de android. Estoy atascado como la forma de referirse a la misma memoria de fragmentos entre dos aplicaciones diferentes. Ahora también estoy confundido si memoryFile se utiliza para el mismo propósito o no. Http://developer.android.com/reference/android/os/MemoryFile.html este enlace que encontré con respecto al tema. Gracias por adelantado. Krishna
- Android: fugas de memoria al crear dinámicamente UI con fondos de recursos de imagen
- SocketTimeoutException Android
- Tabla de referencia local de JNI de Android Expand
- Problema con la descarga de varios archivos con AsyncTask
- ¿Cuál es la cantidad máxima de RAM que una aplicación puede usar?
- Los archivos masivos de hprof que se crean de alguna manera, me impide empujar
- Prueba Android "destruir actividad para ahorrar espacio"
- Lenta Cargando imágenes grandes con Picasso
- Cuando se reemplaza un fragmento y se coloca en la pila de atrás (o se quita) ¿permanece en la memoria?
- Fuga de memoria AsyncTask
- ¿Será este ejemplo de Android seguro de usar, la memoria de fugas?
- ¿Este patrón de mensajería de Servicio de Actividad causa una pérdida de memoria?
- Proceso de fondo de caché de Android está aumentando continuamente
Si desea utilizar algunos procesos MemoryFile
con MemoryFile
puede utilizar el siguiente método fugly :
import android.os.MemoryFile; import android.os.ParcelFileDescriptor; import java.io.FileDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MemoryFileUtil { private static final Method sMethodGetParcelFileDescriptor; private static final Method sMethodGetFileDescriptor; static { sMethodGetParcelFileDescriptor = get("getParcelFileDescriptor"); sMethodGetFileDescriptor = get("getFileDescriptor"); } public static ParcelFileDescriptor getParcelFileDescriptor(MemoryFile file) { try { return (ParcelFileDescriptor) sMethodGetParcelFileDescriptor.invoke(file); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } public static FileDescriptor getFileDescriptor(MemoryFile file) { try { return (FileDescriptor) sMethodGetFileDescriptor.invoke(file); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } private static Method get(String name) { try { return MemoryFile.class.getDeclaredMethod(name); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } }
Lo que debería buscar es el #getParcelFileDescriptor(MemoryFile)
que puede devolver desde una implementación de ContentProvider#openFile(Uri, String)
.
Sospecho que los archivos de memoria no tienen el método getParcelFileDescriptor. Cuando comenté este método relacionado con getParcelFileDescriptor y uso getFileDescriptor. Funcionó muy bien.
import java.io.FileDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.os.MemoryFile; /** * Invoke hidden methods using reflection * */ public class MemoryFileUtil { private static final Method sMethodGetFileDescriptor; static { sMethodGetFileDescriptor = get("getFileDescriptor"); } public static FileDescriptor getFileDescriptor(MemoryFile file) { try { return (FileDescriptor) sMethodGetFileDescriptor.invoke(file); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } private static Method get(String name) { try { return MemoryFile.class.getDeclaredMethod(name); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } }
Y el descriptor de archivo creado del archivo de la memoria.
FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile);
MemoryFile se puede utilizar para asignar a la memoria física. El descriptor de archivo de resultados (fd) se puede pasar al cliente (lado de intercambio de memoria). El cliente puede asignar el mismo fd nativo a la misma región de memoria. La memoria puede entonces ser compartida usando el fd nativo, que se puede asignar a la capa de java usando InputStream.
Consulte este enlace para obtener más detalles:
Compartir la memoria usando ashem.
- My service always getting Waited el tiempo suficiente para: ServiceRecord error in Kitkat
- Generar calor en un teléfono Android (desde el código, por supuesto)