Android开发笔记 合理解决获取唯一标识符及其授权问题
来源:互联网 发布:php匹配字符串 编辑:程序博客网 时间:2024/06/17 00:52
【原文出处:http://blog.csdn.net/leytton/article/details/72476705】
在Android开发中想要获取手机唯一标识符可能因为权限问题导致失败。结合实际需求不亦探索出了比较合理的解决方式。
1、获取设备ID(IMEI)
需要在AndroidManifest.xml文件中添加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
获取设备ID代码
TelephonyManager tm = (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);String imei = tm.getDeviceId();需要注意的是获取失败可能返回为null、""、或者是"0000000000000"
之前的版本是默认授权读取手机识别码的,但Android6.0版本之后添加了权限管理、需要App主动申请授权。
那么我们考虑以下方法。
2、不经过授权获取唯一标识符
根据wifi mac地址、IMEI(imei)、序列号(sn)其中之一作为唯一标识符,获取失败则产生UUID放入缓存当中[1],这种方法还是无法对手机进行有效识别(关闭wifi时无法获取wifi mac地址;如果采用UUID卸载应用后会丢失)。
3、权限请求
为了避免刷装机用户,我们采取强制要求能获取标识符的方式,无法获取则不能进行下一步,提示用户授权。为了增强用户体验,我们尝试以下方法。但都不尽如人意。
(1)跳转到打开权限设置(不推荐)
有的文章介绍的方法为跳转到设置界面让用户打开权限[2],由于手机打开权限设置界面接口标准不一致,个人不推荐此法。
(2)动态授权返回结果
参考《Android7.0动态申请打电话的权限》[3],稍作修改即可实现手机标识符读取动态授权
但提示用户的是读取手机电话信息授权,这样会给用户造成窃取用户信息的感觉、用户比较抵触。
final int REQUEST_CODE_READ_DEVICE_ID=1001; /** * 申请权限 */ private void requestPermission() { //判断Android版本是否大于23 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},REQUEST_CODE_READ_DEVICE_ID); return; } } } /** * 注册权限申请回调 * @param requestCode 申请码 * @param permissions 申请的权限 * @param grantResults 结果 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode){ case REQUEST_CODE_READ_DEVICE_ID: if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ LoginAction(); }else{ ToastUitl.showLong("请开启手机识别码读取权限"); } break; default: super.onRequestPermissionsResult(requestCode, permissions, grantResults); } }
4、绕过默认权限请求
在开发过程中,我们发现某款App安装时默认允许读取手机识别码。为什么我们的就不行?Why?
在文章《Android M 新的运行时权限开发者需要知道的一切》[6]中我们看到targetSdkVersion设置为23以下(如22)、则默认允许,我们经过验证该App的targetSdkVersion。
(1)查看App支持的API版本
进入Android SDK目录。sdk\build-tools\android-4.4.2 以4.4.2为例,可以参照自己的platform版本[4]
aapt.exe list -a someapk.apk > apkversion.txt
然后用记事本之类的应用打开apkversion.txt 搜索targetSdkVersion,
显示android:targetSdkVersion(0x...)=(type 0x10)0x16 十六进制转十进制对应22,果然如此,我们进行下一步操作。
(2)附:根据API找到对应Android版本[5]
N
平台亮点Android 6.023M
平台亮点Android 5.122LOLLIPOP_MR1
平台亮点Android 5.021LOLLIPOP
Android 4.4W20KITKAT_WATCH
仅限 KitKat for WearablesAndroid 4.419KITKAT
平台亮点Android 4.318JELLY_BEAN_MR2
平台亮点Android 4.2、4.2.217JELLY_BEAN_MR1
平台亮点Android 4.1、4.1.116JELLY_BEAN
平台亮点Android 4.0.3、4.0.415ICE_CREAM_SANDWICH_MR1
平台亮点(3)妙用targetSdkVersion绕过权限申请
如果app的targetSdkVersion 低于 23,那将被认为app没有用23新权限测试过,那将被继续使用旧有规则:用户在安装的时候默认接受所有权限,安装后app就直接有了那些权限[6]。所以将targetSdkVersion版本设置成22就行了。
我们在Android Studio中打开SDK管理器:Tools > Android > SDK Manager ,勾选API22版本,即Android5.1安装,如下图:
安装成功后设置targetSdkVersion
编译运行、默认允许读取手机标识符。当用户手动关闭时弹出授权请求(动态授权返回结果)。
5、参考文献
[1]Android获取设备唯一标识完美解决方案
http://blog.csdn.net/langzi7758521/article/details/52496180 http://blog.csdn.net/leytton/article/details/72178559
[2]android各大手机系统打开权限管理页面 http://blog.csdn.net/vinomvp/article/details/52228377
[3]Android7.0动态申请打电话的权限 http://blog.csdn.net/u010889616/article/details/55802622
[4]如何查看apk需要支持的Android版本 http://blog.csdn.net/huiguixian/article/details/39928089
[5]最新Android系统版本与API等级对应关系表 http://www.cnblogs.com/rencm/p/5315353.html
[6]Android M 新的运行时权限开发者需要知道的一切 http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/
Finally,妈妈说看文章要养成点赞的好习惯哦~(这里要特别划重点,考试肯定会考的)
- Android开发笔记 合理解决获取唯一标识符及其授权问题
- android获取唯一标识符
- android获取设备唯一标识符
- Android设备获取唯一标识符
- iOS开发-获取设备唯一标识符(UUID)
- android 获取手机的唯一标识符
- 获取Android设备的唯一标识符
- 获取唯一设备标识符
- 获取唯一标识符
- iOS 唯一标识符获取
- 如何使用Cordova获取Android的唯一标识符
- iOS唯一标识符的获取
- MFC - 获取CPU唯一标识符
- iOS获取设备唯一标识符
- 获取手机的唯一标识符
- iOS获取设备唯一标识符
- IOS9获取设备唯一标识符
- iOS获取设备唯一标识符
- 笔记本无线网卡失效(红叉)故障排除
- ListView滑动使得标题栏背景渐变(透明-不透明)
- android代码规范
- error: no such device: xxx xxx Entering rescue mode... grub rescue >
- 非递归中序遍历二叉树
- Android开发笔记 合理解决获取唯一标识符及其授权问题
- WebSocket基本应用
- 在二叉查找树中插入节点
- Matlab中关于CMA的介绍
- 关于oracle创建定时器和定时器创建成功后不运行的问题解决
- LNMP
- 机器学习算法一览
- Thread物联网标准
- Vim操作的四种模式与切换