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();
}
}
android studio 使用 aidl(三)权限验证的更多相关文章
- android studio 使用 aidl(二)异步回调
基础使用请移步 android studio 使用 aidl (一) 首先建立在server端建立两个aidl文件 ITaskCallback.aidl 用于存放要回调client端的方法 // IT ...
- android studio 使用 aidl(一)基础用法
最近公司需要开发一个项目用的到aidl,之前研究过eclipse版本的,但是好久了一直没用,现在需要捡起来,但是现在都用android studio了,所以查了下资料 都不是很全,我在这里总结一下,方 ...
- Android Studio系列教程三--快捷键
Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...
- 【转载】Android Studio Service AIDL 详解
公司产品之前IM这块存在很多问题,消息到达率低,加上协议上有些问题,丢消息频繁,所以需要重构IM,AIDL不能解决以上问题.好吧!那AIDL可以解决什么问题?什么是AIDL? 什么是AIDL? AID ...
- Android studio 使用心得(三)—从Eclipse迁移到Android studio
断断续续的也算是把eclipse上的代码成功迁移到android studio上来了,现在,我同事继续用eclipse,我用android studio,svn上还是之前eclipse的项目,迁移成功 ...
- Android Studio模拟器的root权限
前言 一个安卓练习中用自带的sqlite3数据库查看数据的时候,需要通过adb shell进入/data/data/[包名]/databases/目录中,通过查看创建的数据库来查看相应的数据或者表.起 ...
- Android Studio 学习笔记(三):简单控件及实例
控件.组件.插件概念区分 说到控件,就不得不区分一些概念. 控件(Control):编程中用到的部件 组件(Component):软件的组成部分 插件(plugin): 应用程序中已经预留接口的组件 ...
- Android Studio精彩案例(三)《模仿微信ViewPage+Fragment实现方式二》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 写在前面的话:此专栏是博主在工作之余所写,每一篇文章尽可能写的思路清晰一些,属于博主的"精华"部分,不同于以往专栏 ...
- Android Studio 学习(三) 广播
动态注册监听网络变化 创建intentFilter 并addAction 代表了监听哪个广播 然后使用registerReceiver()方法 将intentFilter 与 自己创建的监听器 传进去 ...
随机推荐
- Memory Analyzer Tool 使用
转载出处:https://wensong.iteye.com/blog/1986449 最近一段时间一直在研究热部署,热部署中涉及到一个比较头痛的问题就是查内存泄露(Memory Leak),于是乎在 ...
- VIM处理工具与正则表达式
*本文中/data目录为训练目录 1.在vim中设置TAB缩进为四个字符 打开vim 输入:set tabstop=4 2.复制/etc/rc.d/init.d/functions文件至/tmp/,替 ...
- not noly go —— 运行轨迹[一]
前言 学习一下go 语言,也不完全是go,几乎是所以语言通用的部分,主要在于巩固一下基础,几乎不会涉及到语法相关的东西. 正文 前置内容 说起语言,很多人喜欢谈论解释型语言和编译型语言,其实对语言谈论 ...
- 常见的yaml写法-CronJob
CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行.这个实际上和我们Linux中的crontab就非常类似了.一个CronJob ...
- 问题 L: Yougth的最大化
题目描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和V ...
- 普通邮箱设置客户端授权码并开启stmp服务以及关于QQ邮箱“命令顺序不正确。 服务器响应为:Error: need EHLO and AUTH first !”问题全指导
Zoomla!逐浪CMS带有强大的邮局功能,可以用于发送邮件与进行事务管理. 其中邮局配置大家不太熟悉这里提供一系列教程. 1.首先在QQ邮箱当中开启"POP3/SMTP服务" 2 ...
- IDEA maven Run Maven 启动方式
首先想要使用 Run Maven 启动需要在IDEA设置里找到plugins 在plugins窗口下面找到Browse Repositories 打开Browse Repositories 下载 ...
- 菜鸡的Java笔记 第三十一 扩展结构
.新特性 可变参数的意义以及实现 那么下面通过一个简单的思考来分析可变参数的存在意义 范例:如果说现在要定义一个方法,这个方法可以实现任意多个 ...
- 菜鸡的Java笔记 第二十九 - java 单例设计模式
SingleCase 单例设计模式 1.单例设计模式的特点 2.多例设计模式的特点 内容 单例设计模式 现在如果说有这么一个程序类 class S ...
- 『学了就忘』Linux软件包管理 — 47、Linux源码包的安装和卸载
目录 1.源码包安装服务的注意事项 2.源码包安装服务的过程 3.源码包安装服务的删除 4.源码包安装服务的启动 5.源码包安装服务的关闭 1.源码包安装服务的注意事项 (1)安装服务选择哪种软件包? ...