现象
Android 开发过程中 我们可能会申请到各种权限 有些属于高危权限,需要用户同意才能获取,有些则不需要动态申请只要在AndroidManifese.xml
中注册就好了。今天我们来讲一下一些’'诡异的权限",为什么说它诡异呢,因为这些权限根本不需要动态申请,只需要在AndroidManifese.xml
中注册就好,甚至根本连清单文件里都不需要注册,但是这些权限却会在你使用到功能模块的时候弹窗出来,而且它们还可能出现在应用设置界面的权限申请列表中。这就很尴尬了,明明我没有申请这些权限,可能都没用到,为什么会突然冒出来?
比如:网络使用权限、开启或关闭WIFI、开启或关闭蓝牙、读应用列表权限、获取运动数据
等。
由来
有些权限在低版本根本不需要申请,也不弹窗提示,而这些问题出现的原因都是由于各大厂商的ROM定制引起的。
- 网络使用权限
典型:ViVo手机 弹窗让用户选择 - 开启或关闭WIFI
典型:OPPO VIVO 小米等 弹窗让用户选择 - 开启或关闭蓝牙
典型:OPPO VIVO 小米等 弹窗让用户选择 - 读应用列表权限
典型:魅族 弹窗让用户选择 - 获取运动数据
典型:华为 应用设置列表显示获取运动数据权限(部分机型会弹窗让用户选择,没测过)
我们今天着重讲下获取运动数据
这个权限,听名字我们大概猜得出这个权限跟传感器有关,但是系统传感器根本不用我们申请,为什么在权限申请列表里有这个,我们看下常用的几个传感器类型
public static final int TYPE_ACCELEROMETER = 1;
TYPE_ACCELEROMETER //加速度传感器
TYPE_ORIENTATION //方向传感器
TYPE_GYROSCOPE //陀螺仪传感器
TYPE_LIGHT //光传感器
TYPE_PRESSURE //压力传感器
TYPE_TEMPERATURE //温度传感器
TYPE_GRAVITY //重力传感器
TYPE_LINEAR_ACCELERATION //加速度传感器
经测试,只要我们注册(这里的注册是指SensorManager.registerListener())
了并且调用了(只写代码是不会立即加上的,必须运行到代码)TYPE_ACCELEROMETER
加速度传感器,申请列表就会出现,而其他的传感器则不会。
SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
SensorEventListener sensorEventListener= new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//只要注册并且运行了,就会有 获取运动数据 权限
sm.registerListener(sensorEventListener, sensor,SensorManager.SENSOR_DELAY_UI);
并且这个权限一旦同意,再取消注册这个传感器也没用,权限依然在,只能手动到权限列表关闭。
另外如果用户拒绝或者手动关闭这个权限,这时候我们的程序是不会报错或者闪退的,但是却获取不到这些信息。
总结
因为Android手机的碎片化,各大厂商的ROM定制导致的问题,让开发者越来越头疼,不过这些权限也同样是为了用户的隐私安全,只能期待越来越好吧。