android studio 使用 aidl(三)权限验证

这篇文章是基于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();
}
}
原文地址:https://www.cnblogs.com/androidxiaoyang/p/5919372.html