已解决
Android使用AIDL+MemoryFile传递大数据
来自网友在路上 11138113提问 提问时间:2023-11-24 01:01:41阅读次数: 113
最佳答案 问答题库1138位专家为你答疑解惑
Android进程间通信经常会使用AIDL,简单方便,但是数据量有限制,超过一定值会报错:
E !!! FAILED BINDER TRANSACTION !!! (parcel size = 2073744)
可以通过使用AIDL+MemoryFile传递大数据
新建AIDL接口:
interface OnFileListener{/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void onFile(in ParcelFileDescriptor file);
}
添加监听接口
void addFileListener(OnFileListener listener);
服务端发送数据
MemoryFile imageFile = new MemoryFile(System.currentTimeMillis()+"image.data",image.length);imageFile.writeBytes(image,0,0,image.length);ParcelFileDescriptor pfd = getParcelFileDescriptor(imageFile);if (pfd!=null){listener.sendFile(pfd);}fun getParcelFileDescriptor(memoryFile: MemoryFile): ParcelFileDescriptor? {return try {val method: Method = MemoryFile::class.java.getDeclaredMethod("getFileDescriptor")method.setAccessible(true)val fd: FileDescriptor = method.invoke(memoryFile) as FileDescriptorParcelFileDescriptor.dup(fd)} catch (e: Exception) {e.printStackTrace()null}}
客户端接收数据
service.addFileListener(new OnFileListener.Stub() {@Overridepublic void onFile(ParcelFileDescriptor pfd) throws RemoteException {try {FileInputStream fis = new FileInputStream(pfd.getFileDescriptor());ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] buf = new byte[1920*1080];int len;while ((len = fis.read(buf)) != -1) {bos.write(buf, 0, len);} bos.close();fis.close();pfd.close();}catch (Exception e){e.printStackTrace();}}});
实测实时传递Camera数据比较流畅
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Android使用AIDL+MemoryFile传递大数据":http://eshow365.cn/6-42146-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!