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