获取运动数据权限怎么来的?

获取运动数据权限

现象

Android 开发过程中 我们可能会申请到各种权限 有些属于高危权限,需要用户同意才能获取,有些则不需要动态申请只要在AndroidManifese.xml中注册就好了。今天我们来讲一下一些’'诡异的权限",为什么说它诡异呢,因为这些权限根本不需要动态申请,只需要在AndroidManifese.xml中注册就好,甚至根本连清单文件里都不需要注册,但是这些权限却会在你使用到功能模块的时候弹窗出来,而且它们还可能出现在应用设置界面的权限申请列表中。这就很尴尬了,明明我没有申请这些权限,可能都没用到,为什么会突然冒出来?

比如:网络使用权限、开启或关闭WIFI、开启或关闭蓝牙、读应用列表权限、获取运动数据 等。

由来

有些权限在低版本根本不需要申请,也不弹窗提示,而这些问题出现的原因都是由于各大厂商的ROM定制引起的。

  1. 网络使用权限
    典型:ViVo手机 弹窗让用户选择
  2. 开启或关闭WIFI
    典型:OPPO VIVO 小米等 弹窗让用户选择
  3. 开启或关闭蓝牙
    典型:OPPO VIVO 小米等 弹窗让用户选择
  4. 读应用列表权限
    典型:魅族 弹窗让用户选择
  5. 获取运动数据
    典型:华为 应用设置列表显示获取运动数据权限(部分机型会弹窗让用户选择,没测过)

我们今天着重讲下获取运动数据这个权限,听名字我们大概猜得出这个权限跟传感器有关,但是系统传感器根本不用我们申请,为什么在权限申请列表里有这个,我们看下常用的几个传感器类型
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定制导致的问题,让开发者越来越头疼,不过这些权限也同样是为了用户的隐私安全,只能期待越来越好吧。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取运动摆臂次数需要通过传感器监测用户的手臂运动,然后进行数据处理才能得到摆臂次数。下面是一个简单的示例代码,可以通过加速度传感器来检测手臂摆动。 首先,在AndroidManifest.xml文件中添加如下权限: ```xml <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-feature android:name="android.hardware.sensor.accelerometer" /> ``` 然后,在Activity中注册加速度传感器,并在onSensorChanged()方法中监听加速度变化,进行数据处理: ```java public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; private Sensor accelerometerSensor; private float lastX, lastY, lastZ; private int swingCount = 0; private boolean isSwinging = false; private long lastSwingTime = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册加速度传感器 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; // 计算加速度的变化量 float deltaX = Math.abs(lastX - x); float deltaY = Math.abs(lastY - y); float deltaZ = Math.abs(lastZ - z); // 判断是否在摆动状态 if (deltaX + deltaY + deltaZ > 15) { isSwinging = true; lastSwingTime = System.currentTimeMillis(); } else { isSwinging = false; } // 如果摆动时间小于1秒,并且状态从非摆动变为摆动,则摆臂次数加1 if (isSwinging && System.currentTimeMillis() - lastSwingTime < 1000) { if (!isSwinging) { swingCount++; } } lastX = x; lastY = y; lastZ = z; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } } ``` 在上述代码中,swingCount表示摆臂次数,isSwinging表示当前是否在摆动状态,lastSwingTime表示上次摆动的时间。当加速度变化量大于一定阈值时,判断为摆动状态,如果持续时间小于1秒,则认为是一次有效的摆动,摆臂次数加1。 需要注意的是,这只是一个简单的示例代码,实际应用中需要进行更加精细的数据处理和算法优化,才能得到更加准确的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值