• 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();
    }
    }
  • 相关阅读:
    获取url中的参数
    css 实现单行以及多行文本溢出显示省略号
    页面跳转不带 referrer的方法
    iframe加载完成事件
    es6模块化规则(一)
    kindle电子书下载网站收藏
    vue多页面项目配置
    使用原生ajax及其简单封装
    在vue中使用jq或者第三方插件
    写博客常用语法
  • 原文地址:https://www.cnblogs.com/androidxiaoyang/p/5919372.html
Copyright © 2020-2023  润新知