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();
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM