天天看点

Android 跨进程传输大图片

项目需求

实现客户端发送大图片到服务端。 

 思路

通过传递FD来实现Bitmap的传输(通过FD可以访问共享内存),所以客户端直接把FD传过去,服务端通过FD来获取Bitmap,因为普通的传递图片最多只支持1M,超过就会出错。传递FD不管图片多大,都不会出错。

代码实现 

跨进程通信我采用的是AIDL,AIDL怎么创建就不多说了,直接看代码。
//service定义通信接口
interface MemoryInterface {
    Bundle shareMemory(inout Bundle bundle);
}


//将本地图片转为bitmap
bitmap_animal = BitmapFactory.decodeResource(this.getResources(), R.drawable.er);
//将图片写入共享内存
memoryFile = new MemoryFile("test", bitmap_animal.getByteCount() );
memoryFile.getOutputStream().write(bitmap2Bytes(bitmap));
//获取文件FD
Method method = MemoryFile.class.getDeclaredMethod("getFileDescriptor");
FileDescriptor fd = (FileDescriptor) method.invoke(memoryFile);
//保存FD到这个序列化对象
ParcelFileDescriptor descriptor = ParcelFileDescriptor.dup(fd);
//创建Bundle,传递对象
Bundle bundle = new Bundle();
bundle.putParcelable("client", descriptor);
//调用service接口
memoryInterface.shareMemory(bundle);   


//service接收
ParcelFileDescriptor parcelable = bundle.getParcelable("client");
//获取FD
FileDescriptor fd = parcelable.getFileDescriptor()
//通过FD获得输入流
FileInputStream fileInputStream = new FileInputStream(fd);
//转化Bitmap进行展示
bitmap = inputStream2Bitmap(fileInputStream);                                                                                        
           

 到这里就结束了。