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數據比較流暢