在Android中记忆文件有什么用途

2022-09-04 20:57:45

我想将一些字节写入共享内存。这是在我的应用程序中完成的1。从我的另一个应用程序:应用程序2,我想访问该共享内存以读取写入的字节。为此,我尝试使用Android的MemoryFile类。我被困在如何引用两个不同应用程序之间的相同分片内存。我现在也感到困惑,如果memoryFile是否用于相同的目的。http://developer.android.com/reference/android/os/MemoryFile.html 我找到的关于这个主题的链接。提前致谢。奎 师 那


答案 1

如果你想要一些跨进程使用,你可以使用以下模糊的方法:MemoryFile

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);
        }
    }
}

您应该关注的是可以从 的实现返回的方法。#getParcelFileDescriptor(MemoryFile)ContentProvider#openFile(Uri, String)


答案 2

我怀疑内存文件没有getParcelFileDescriptor方法。当我评论这个getParcelFileDescriptor相关方法并使用getFileDescriptor时。它工作得很好。

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);
        }
    }
}

并从内存文件创建了文件描述符。

FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile);