服务端
- 创建.aidl文件
- 添加mk文件
LOCAL_SRC_FILES += \
src/com/android/zf/sharedata/aidl/ICameraShareData.aidl \
src/com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \
LOCAL_AIDL_INCLUDES += \
com/android/zf/sharedata/aidl/ICameraShareData.aidl \
com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \
ISharedataArrivedListener.aidl
package com.android.zf.sharedata.aidl;
interface ISharedataArrivedListener {
/**
* AIDL客户端回调,返回服务端相应状态
* @param data
*/
void onNewFrameDataArrived(inout byte[] data,int start, int end,boolean theEndPart);
}
ICameraShareData.aidlpackage com.android.zf.sharedata.aidl;
import com.android.zf.sharedata.aidl.ISharedataArrivedListener;
interface ICameraShareData{
/**
*初始化framedatabuffer
*/
int initDataBuffer(int w, int h);
/**
*初始化framedatabuffer
*/
void releaseDataBuffer();
/**
*输入帧数据
*/
void inputFrameData(out byte[] data);
/**
*输入帧数据
*/
void inputFrameDataByJoin(out byte[] data,int start, int end, boolean theEndPart);
/**
*输出帧数据
*/
byte[] outFrameData();
void inputFrameDataLock();
void inputFrameDataUnLock();
void registerListener(ISharedataArrivedListener listener);
void unregisterListener(ISharedataArrivedListener listener);
}
CameraShareDataService.java文件,
package com.android.zf.sharedata.services;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.android.zf.sharedata.aidl.*;
import java.util.ArrayList;
public class CameraShareDataService extends Service{
private final static String TAG = "CameraShareDataService";
private int width = 0;
private int height = 0;
private byte[] framebuffer = null;
private boolean lock = false;
//private ICameraShareData.Stub mCameraShareData = null;
private ArrayList<ISharedataArrivedListener> mArrayListListener = new ArrayList<ISharedataArrivedListener>();
private IBinder mCameraShareData = new ICameraShareData.Stub(){
@Override
public int initDataBuffer(int w, int h){
Log.d(TAG,"inputFrameData ");
lock = false;
width = w;
height = h;
framebuffer = new byte[(width*height*3)>>1];
if(framebuffer == null){
return -1;
}else {
return 0;
}
}
@Override
public void releaseDataBuffer(){
Log.d(TAG,"inputFrameData ");
lock = false;
framebuffer = null;
}
@Override
public void inputFrameDataLock(){
//Log.d(TAG,"inputFrameDataLock ");
lock = true;
return;
}
@Override
public void inputFrameDataUnLock(){
Log.d(TAG,"inputFrameDataUnLock ");
lock = false;
return;
}
@Override
public void inputFrameData(byte[] data){
String strRead = new String(data);
strRead = String.copyValueOf(strRead.toCharArray(), 0, data.length);
Log.d(TAG,"inputFrameData data=="+strRead);
if(framebuffer != null){
//System.arraycopy(data,0,framebuffer,0,data.length);
//onNewFrameDataArrived(framebuffer);
}
return ;
}
@Override
public void inputFrameDataByJoin(byte[] data, int start, int end,boolean theEndPart){
//Log.d(TAG,"inputFrameDataByJoin ");
//if(lock){
//if(framebuffer != null){//Arrays.copyOfRange
//System.arraycopy(data,start,framebuffer,start,end-start);
onNewFrameDataArrived(data,start,end,theEndPart);
//}
//}
}
@Override
public byte[] outFrameData(){
return framebuffer;
}
@Override
public void registerListener(ISharedataArrivedListener listener){
if(!mArrayListListener.contains((ISharedataArrivedListener)listener)){
Log.d(TAG,"registerListener success");
mArrayListListener.add(listener);
}else{
Log.d(TAG,"registerListener fail");
}
}
@Override
public void unregisterListener(ISharedataArrivedListener listener){
if(mArrayListListener.contains((ISharedataArrivedListener)listener)){
Log.d(TAG,"unregisterListener success");
mArrayListListener.remove((ISharedataArrivedListener)listener);
}else{
Log.d(TAG,"unregisterListener fail");
}
}
};
@Override
public void onCreate() {
super.onCreate();
//new Thread(new ServiceNotify()).start();
}
@Override
public IBinder onBind(Intent intent) {
return mCameraShareData;
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void onNewFrameDataArrived(byte[] data, int start, int end,boolean theEndPart){
for(int i=0;i<mArrayListListener.size();i++){
ISharedataArrivedListener listener = mArrayListListener.get(i);
try{
if(listener != null) {
listener.onNewFrameDataArrived(data,start,end,theEndPart);
}
}catch (RemoteException exception){
exception.toString();
}
}
}
}
客户端
- 创建.aidl文件(从服务端,拷贝而来,完全一样)
- 添加mk文件
LOCAL_SRC_FILES += \
src/com/android/zf/sharedata/aidl/ICameraShareData.aidl \
src/com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \
LOCAL_AIDL_INCLUDES += \
com/android/zf/sharedata/aidl/ICameraShareData.aidl \
com/android/zf/sharedata/aidl/ISharedataArrivedListener.aidl \
调用的代码:
public void onStart() {
Intent mIntent = new Intent();
mIntent.setAction("com.android.zf.sharedata.aidl.CAMERA_SHARE_DATA_SERVICE");//你定义的service的action
mIntent.setClassName("com.android.zf.sharedata","com.android.zf.sharedata.services.CameraShareDataService");
mCameraActivity.getApplicationContext().bindService(mIntent,mServiceConnection, Context.BIND_AUTO_CREATE);
}
public void onStop() {
mCameraActivity.getApplicationContext().unbindService(mServiceConnection);
}
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
android.util.Log.d("CameraShareDataService", "onServiceConnected ");
mCameraShareData = ICameraShareData.Stub.asInterface(iBinder);
try {
mCameraShareData.registerListener(mSharedataArrivedListener);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
android.util.Log.d("onServiceDisconnected","onServiceConnected ");
try {
mCameraShareData.unregisterListener(mSharedataArrivedListener);
} catch (RemoteException e) {
e.printStackTrace();
}
mCameraShareData = null;
}
};