关于安卓开发计步器在安卓10.0版本无法显示步数问题

  由于某种原因,要做一个安卓的简单计步器,只有一点JAVA知识的我参照了【二克拉梦想 】这个大佬的CSDN博客github,制作了 一个简单的安卓计步器。
  首先万分感谢大佬的付出让我节省了很多时间,由于大佬这个代码是3年前的作品,对于现在版本已经升级到10.0的手机来说,也出现了一些不兼容的现象:即在安卓9版本之前(我试过安卓9、6和4.4.4版本)的手机上安装该计步器可以正常显示步数;而在安卓10.0以上版本的手机上安装计步器,步数一直不显示或者显示false。
  由于已经知道安卓9可以,而安卓10.0却显示不了,我查找了一下安卓10与安卓9的对比有什么改变,发现安卓10完善了权限的机制,然后搜了一下关键字“安卓10、计步器、权限”,终于在这篇CSDN博客:Android10.0,计步传感器(Sensor.TYPE_STEP_COUNTER) 无法计步找到了原因。
  blog上讲:您必须声明 ACTIVITY_RECOGNITION 权限,以便您的应用在运行 Android 10 (API 级别 29) 或更高版本的设备上使用计步传感器,然后在AndroidManifest.xml文件中找不到这个权限的申明,为了在安卓10上成功运行该计步器,就需要动态申请该权限
  但是这篇博客对于我这种安卓小白来说,完全不知道这些代码插到什么位置,而且这个只是添加了系统自动申请该权限,没有添加用户手动申请权限。所以我又找了一篇动态申请权限的博客来参考:Android动态申请权限
  好了,现在开始步入正题,讲一讲是如何动态申请ACTIVITY_RECOGNITION 权限。

①在AndroidManifest.xml文件中加入ACTIVITY_RECOGNITION 权限。

<!--安卓10.0版本以上必须申请的健身运动权限-->
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

②在MainActivity.java文件一开始定义变量的地方定义相应变量,以便后面使用。

//动态申请健康运动权限
    private String[] permissions={Manifest.permission.ACTIVITY_RECOGNITION};
    private AlertDialog dialog;

③在MainActivity.java文件的onCreate方法中,在

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

代码后面加入

 // 版本判断。当手机系统是安卓10.0时,才有必要去判断权限是否获取
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // 检查该权限是否已经获取
            int get = ContextCompat.checkSelfPermission(this, permissions[0]);
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (get != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求自动开启权限
                ActivityCompat.requestPermissions(this, permissions, 321);
            } else {//如果已经申请,则进入应用(这里填onCreate方法后面的代码)
                Intent intent = new Intent(MainActivity.this, BindService.class);
                isBind =  bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
                startService(intent);
            }
        } else {//如果版本低于10.0,则直接进入应用(这里填onCreate方法后面的代码)
            Intent intent = new Intent(MainActivity.this, BindService.class);
            isBind =  bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
            startService(intent);
        }

Build.VERSION_CODES.Q //API29,即安卓10
Build.VERSION_CODES.P //API28,即安卓9
Build.VERSION_CODES.M //API23。
  上述代码判断目前系统版本Build.VERSION.SDK_INT是否大于10.0版本,如果是,则判断是否有该权限,没有就调用ActivityCompat.requestPermissions方法,即是系统自动提示用户是否开启健康运动权限。如下图所示:
提示用户是否开启健康运动权限
④对于该方法,自然要写一个回调方法onRequestPermissionsResult对用户的反应做处理(在AndroidManifest.xml的类里面随便找个地方贴该方法,后面的代码也是这样,当然贴一起最好,只要不贴到别的方法里面就行):

// 用户权限申请的回调方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 321) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    //提示用户手动开启权限
                    showDialogTipUserGoToAppSettting("健康运动权限", "健康运动权限不可用");
                }
            }
        }
    }
    // 提示用户去应用设置界面手动开启权限
    private void showDialogTipUserGoToAppSettting(String title, String message) {
        dialog = new AlertDialog.Builder(this)
                .setTitle(title)
                .setMessage(message)
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 跳转到应用设置界面
                        Intent intent = new Intent();
                        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", getPackageName(), null);
                        intent.setData(uri);
                        startActivityForResult(intent, 123);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(),"没有获得权限,应用无法运行!", Toast.LENGTH_SHORT).show();
                        finish();
                    }
                }).setCancelable(false).show();
    }

  如果用户点了始终允许,那就可以进入应用了;但是如果用户点了禁止或者禁止后不再提示,则系统由于无法获取健康运动权限(ACTIVITY_RECOGNITION ),又因为这个简单的计步器必须需要该权限才能运行,所以我们要在这里加上 showDialogTipUserGoToAppSettting方法去提示用户手动开启该权限,如下图所示:
手动开启权限
如果用户点击取消之后,则会退出应用并弹出显示。如下:
没有权限
⑤用户点击立即开启后,则执行startActivityForResult(intent, 123);方法,该方法会跳转到手机的应用信息界面,在这个界面可以打开或关闭应用的权限。当然对于该方法自然要也写一个回调方法onActivityResult对用户的反应做处理。

//手动设置权限后回调,检查有没有权限
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 123) {
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                // 检查该权限是否已经获取
                int get = ContextCompat.checkSelfPermission(this, permissions[0]);
                // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
                if (get != PackageManager.PERMISSION_GRANTED) {
                    // 提示用户应该去应用设置界面手动开启权限
                    Toast.makeText(getApplicationContext(),"没有获得权限,应用无法运行!", Toast.LENGTH_SHORT).show();
                    finish();
                } else {
                    dialog.dismiss();
                    Toast.makeText(getApplicationContext(),"权限授予成功!", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(MainActivity.this, BindService.class);
                    isBind =  bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
                    startService(intent);
                }
            }
        }
    }

  如果用户没有修改该权限就想返回应用界面,那就会如上图显示并退出应用;如果用户成功修改了该权限,然后返回应用界面,计步器可以正常运行,并如下图所示:
权限授予成功
⑥最后,经过一番代码修改,生成的apk也能兼容安卓10.0版本的手机,可以正常显示步数。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值