这篇文章是基于android studio 使用 aidl (一) 和 android studio 使用 aidl(二) 异步回调 下面的代码都是简化的,如果看不懂请先移步上2篇文章
网上的东西太坑,找了半天也没有找到详细一点的,没办法只能自己一点一点的试。。
第一步:首先需要在服务端的在AndroidMenifest中声明所需权限
<permission android:name="com.txy.umpay.aidl.permission.OPERATION_HARDWARE" android:protectionLevel="normal" /> <uses-permission android:name="com.txy.umpay.aidl.permission.OPERATION_HARDWARE" />
第一种方法在Service中的onBind方法中处理:
public IBinder onBind(Intent t) { Log("service on bind"); //第一种远程调用的验证方式 int check = checkCallingPermission("com.txy.umpay.aidl.permission.OPERATION_HARDWARE"); if (check == PackageManager.PERMISSION_DENIED) { Log("客户端没有权限调用"); return null; } return mBinder; }
这种客户端如果没有在应用中声明<uses-permission android:name="com.txy.umpay.aidl.permission.OPERATION_HARDWARE" />
权限 就会绑定失败,这种方式一直不成功不知道为什么!
第二种方法就是在ITaskBinder.Stub mBinder = new ITaskBinder.Stub() 的onTransact(int code, Parcel data, Parcel reply, int flags)方法中,我感觉这个方法就相当于一个拦截器,只要客户端调用ITaskBinder的方法就会先触发onTransact这个方法,这个方法返回boolean值 返回false则其他方法就调用不成功了。
//在这做权限验证,类似拦截器 public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { Log("这是拦截器!code:" + code + "---flags:" + flags); String packageName = null; String[] packages = getPackageManager(). getPackagesForUid(getCallingUid()); if (packages != null && packages.length > 0) { packageName = packages[0]; } if (packageName == null) { return false; } boolean checkPermission = checkPermission(MAIDLService.this, "com.txy.umpay.aidl.permission.OPERATION_HARDWARE", packageName); if (!checkPermission) { return false; } return super.onTransact(code, data, reply, flags); }
private boolean checkPermission(Context context, String permName, String pkgName) { PackageManager pm = context.getPackageManager(); if (PackageManager.PERMISSION_GRANTED == pm.checkPermission(permName, pkgName)) { return true; } else { return false; } }
客户端AndroidManifest.xml中添加权限:
<uses-permission android:name="com.txy.umpay.aidl.permission.OPERATION_HARDWARE" />
在来看下客户端是怎么 调用的
private void open1() {
try {
if (service != null) {
service.unregisterCallback(mCallback);
}else{
Log.e("123","绑定失败!");
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
private void open() {
try {
if (service != null) {
service.registerCallback(mCallback);
}else{
Log.e("123","绑定失败!");
}
} catch (RemoteException e) {
e.printStackTrace();
}
}