归纳一下前几天一个Android项目中遇到的两个坑
前几天的一个项目中需要用到手机WIFI和热点。记录一下过程中关于手机WIFI的两个坑,如果你对最新的安卓平台特性不是很了解,你么你极有可能遇到类似的情况。

获取可用网络列表
 APP获取到当前WiFi列表,并且更具需求连接到指定网络进行数据传输。看似简单的需求一不小心就掉坑里了,何来坑呢?如果你当前的开发测试设备是安卓6.0之前的设备,那么在你进行安卓版本测试之前你的程序将跑得很顺畅。

当你开始测试并且安卓版本来到6.0及其以上,那么你极大程度上会发现无法获取可用网络列表,对,无法获取,得到的网络列表为null!那程序之前还跑得好好的,为什么突然就不行了呢,网络权限都配置好了呀。到这一步我们都很容易想到是系统差异问题,那么究竟要怎么弄呢?如果你还在检查网络权限是否完整并且开始怀疑你的代码的正确性那么你就真掉坑里了。行,话不多说,开始查资料,各种渠道,最后在网上发现有很多人遇到了同样的问题,也有不少文章在说这个问题。这就好办了,自己不是第一个掉坑里的,所以有前人的经验可以汲取,问题可以很快解决。在尝试了一些帖子的方法后,发现必须获取定位权限,你没听错,获取位置权限。。。我也是搞不懂为啥获取个WIFI列表需要涉及到位置权限,但是谷歌这样搞肯定有其道理,我们也不能改变啥。两个位置权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
剩下的就是安卓6.0的动态权限申请的一般过程了。引导用户开启位置权限就行了,开启之后你会惊奇地发现APP正常工作了。

设置、开启、关闭热点
同样是一个简单的需求,但在你不熟悉高本版安卓的一些细节的情况下眼前就是会有坑给你踩。动态权限申请自然不必说,这是6.0时引入的一个权限申请机制,在程序运行是动态请求所需的权限。我把所有权限都按照正常的动态权限申请机制要求弄好了,心里想着肯定能行。然而程序测试时我发现我还是太年轻了。。。

由于需要涉及到APP内部开启、关闭、设置热点信息,所以需要一个WRITE_SETTINGS权限,那有什么呢,开启APP时动态申请不就行了?真是这样吗,操作之后发现不行,根本没有提示相关权限。这就不好弄了,还是上网寻求解法吧。

安卓6.0对权限作了分类:正常(Normal Protection)、危险(Dangerous)、特殊(Particular)、其他。而本次需要的更改系统设置权限正是特殊权限中的一个,比危险权限还要高一级,难怪这么复杂。

发现了问题所在接下来就比较好办了。根据官方的示例代码进行申请就行了。以下是权限申请代码:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {       //请求WRITE_SETTINGS权限
    if (!Settings.System.canWrite(getApplicationContext())) {
        Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
        intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getApplicationContext().startActivity(intent);
    }
}

如果你发现该文章存在问题,欢迎联系我,给我留言或者发邮件。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门