zoukankan      html  css  js  c++  java
  • 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();
    }
    }
  • 相关阅读:
    Apache、NGINX支持中文URL
    JS中关于clientWidth offsetWidth scrollWidth 等的含义
    设置apache登陆密码验证
    通过java代码访问远程主机
    win7
    Netty从没听过到入门 -- 服务器端详解
    分块分段
    数论-佩尔方程
    数论-毕达哥拉斯三元组
    HDU 5613-Baby Ming and Binary image
  • 原文地址:https://www.cnblogs.com/androidxiaoyang/p/5919372.html
Copyright © 2011-2022 走看看