這篇文章是基於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();
}
}
