Android AIDL Service 权限验证

754 阅读1分钟

Android Service 添加权限验证

1.服务端和客户端 AndroidManifest.xml添加下面权限,权限名自己定义
<permission
    android:name="com.example.testaidl.permission.ACCESS_BOOK_SERVICE"
    android:protectionLevel="normal" />

<uses-permission android:name="com.example.testaidl.permission.ACCESS_BOOK_SERVICE" />

2.在 Service onBind 方法中验证权限

//1.通过包名验证权限
String packageName = null;
String[] packages = getPackageManager().getPackagesForUid(getCallingUid());
if (packages != null && packages.length > 0) {
    packageName = packages[0];
}
if (packageName == null) {
    return null;
}
//不是指定的包名不能调用
if (!packageName.startsWith("com.example.testaidl")) {
    return null;
}
/**
 * 2.权限验证
 * 下面这两个方法运行在 IPC 通信方法中,所以在 onTransact 方法调用会成功。在 onBind 方法中调用一直都是失败
 * checkCallingPermission
 * checkCallingOrSelfPermission
 * 可以使用 checkPermission 方法
 */
int check = checkPermission("com.example.testaidl.permission.ACCESS_BOOK_SERVICE", getCallingPid(), getCallingUid());
if (check == PackageManager.PERMISSION_DENIED) {
    Log.e(Cont.TAG, "客户端没有权限");
    return null;
}
return mBinder;

3.也可以在 onTransact 方法中验证权限

        @Override
        public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
            //权限验证
            String packageName = null;
            String[] packages = getPackageManager().getPackagesForUid(getCallingUid());
            if (packages != null && packages.length > 0) {
                packageName = packages[0];
            }
            if (packageName == null) {
                return false;
            }
            if (!packageName.startsWith("com.example.testaidl")) {
                return false;
            }

            //使用 checkCallingPermission
            int check = checkCallingPermission("com.example.testaidl.permission.ACCESS_BOOK_SERVICE");
            if (check == PackageManager.PERMISSION_DENIED) {
                Log.e(Cont.TAG, "客户端没有权限");
                return false;
            }

            //或用下面这种方式 使用 checkCallingOrSelfPermission
//            int check = checkCallingOrSelfPermission("com.example.testaidl.permission.ACCESS_BOOK_SERVICE");
//            if (check == PackageManager.PERMISSION_DENIED) {
//                Log.e(Cont.TAG, "客户端没有权限");
//                return false;
//            }
            return super.onTransact(code, data, reply, flags);
        }

github