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 FileDescriptor
ParcelFileDescriptor.dup(fd)
} catch (e: Exception) {
e.printStackTrace()
null
}
}
客户端接收数据
service.addFileListener(new OnFileListener.Stub() {
@Override
public 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数据比较流畅