当前位置:首页 > 编程笔记 > 正文
已解决

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 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!