由于某种原因,要做一个安卓的简单计步器,只有一点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的类里面随便找个地方贴该方法,后面的代码也是这样,当然贴一起最好,只要不贴到别的方法里面就行):

// 用户权限申请的回调方法@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(getApplicationContext(),"没有获得权限,应用无法运行!", Toast.LENGTH_SHORT).show();finish();}}).setCancelable(false).show();}

  如果用户点了始终允许,那就可以进入应用了;但是如果用户点了禁止或者禁止后不再提示,则系统由于无法获取健康运动权限(ACTIVITY_RECOGNITION ),又因为这个简单的计步器必须需要该权限才能运行,所以我们要在这里加上 showDialogTipUserGoToAppSettting方法去提示用户手动开启该权限,如下图所示:

如果用户点击取消之后,则会退出应用并弹出显示。如下:

⑤用户点击立即开启后,则执行startActivityForResult(intent, 123);方法,该方法会跳转到手机的应用信息界面,在这个界面可以打开或关闭应用的权限。当然对于该方法自然要也写一个回调方法onActivityResult对用户的反应做处理。

//手动设置权限后回调,检查有没有权限@Overrideprotected 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版本的手机,可以正常显示步数。

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

  1. 安卓开发,高德地图5.0版本导航部分手机出现白屏

    如题,之前用的老版本的jar包,导航可以正常使用,升级到5.0以后,地图和定位正常,导航出现白屏,并且报 android.view.InflateException: Binary XML file ...

  2. 谷歌相机android4,谷歌相机10.0版本 7.4.200.316937482 安卓版

    谷歌相机10.0版本是一款很棒的清晰的谷歌相机APP.谷歌相机10.0版本的相机功能很强大的,里面的相机拍摄的模式很丰富的,拍摄的相片也很清晰的,非常的适合现在的拍摄的风格的哟,好用可以来下载! 软件 ...

  3. 安装MATLAB工具箱Robotics Toolbox 9.10.0 版本

    Robotics工具包是由Peter Croke团队开发的一款基于Matlab平台的机器人运算.仿真的强大工具,提供对经典手臂型机器人研究和仿真有用的功能,例如运动学.动力学和轨迹生成等. 官网地址: ...

  4. 华为运动健康服务Health Kit 6.10.0版本新增功能速览!

    华为运动健康服务(HUAWEI Health Kit)6.10.0 版本新增的能力有哪些? 阅读本文寻找答案,一起加入运动健康服务生态大家庭! 一. 支持三方应用查询用户测量的连续血糖数据 符合申请H ...

  5. JustAuth发布1.10.0版本,集成华为和企业微信登录,更加灵活的state缓存

    JustAuth发布1.10.0版本,集成华为和企业微信登录,更加灵活的state缓存 更新内容 新增 增加AuthCache配置类AuthCacheConfig.java,可以自定义缓存有效期以及是 ...

  6. OpenKruise v0.10.0 版本发布:新增应用弹性拓扑管理、应用防护等能力

    简介:阿里云开源的云原生应用自动化管理套件.CNCF Sandbox 项目 -- OpenKruise,今天发布 v0.10.0 新版本,这也会是 OpenKruise v1.0 之前的最后一个 mi ...

  7. 讯飞输入法更新10.0版本 上线全新A.I.语音输入引擎

    原标题:讯飞输入法10.0最新版本隆重发布 更快更准更智能 迈入人工智能时代,A.I.赋能并不是简单的口号.近日,讯飞输入法更新至10.0版.据悉,上线全新的A.I.语音输入引擎,使通用语音识别率98 ...

  8. 项目动态|Apache Pulsar 2.10.0 版本介绍

    本文翻译自 StreamNative 博客<What's New in Apache Pulsar 2.10>,作者为李鹏辉.Dave Duggins,原文地址为 https://stre ...

  9. android 10.0版本合入GMS包

    gms包集成步骤: (1) 需要下载对应gms,国内需要通过VPN下载.下载后解压,文件目录:partner_gms.下载时,最好核对一下匹配的android版本. (2)依照路径打开gms.mk/g ...

最新文章

  1. MongoDB日志切换(Rotate Log Files)指南
  2. cmos 和 bios中断大全
  3. node中npm安装模块的网络问题
  4. 九十四、动态规划系列之路径问题
  5. js向服务器发送信息,Angularjs向服务器发送请求
  6. 大牛书单 | 人工智能方向好书推荐
  7. C++学习之路 | PTA乙级—— 1068 万绿丛中一点红 (20 分)(精简)
  8. Bootstrap模态框显示时有阴影遮罩层
  9. 算法高级(17)-SpringCloud中的负载均衡算法
  10. Java日志记录最佳实践
  11. quickselect java,实现快速选择
  12. Linux 更改主机的 host 名
  13. 7月11日安全沙龙演讲主题漏洞与网站挂马
  14. Selenium2用最简xpath查找元素
  15. 接口压力测试工具JMeter
  16. 商城小程序通过交易组件实现直播带货
  17. GNSS 常用缩略语汇总
  18. 25.mc_api介绍及使用示例
  19. 2K和XP的CMD命令教程(命令篇)
  20. 3D机房前端学习笔记

热门文章

  1. 网站优化定位思路以及用户需求数据分析
  2. xunsearch与mysql区别_全文索引xunsearch的详细讲解及sphinx的比较
  3. tslearn 笔记:dtw
  4. java smb下载文件代码_java利用SMB共享文件进行局域网文件的下载及apk升级
  5. 考完了托福,总结一下9天复习参加托福的经验吧
  6. 第2章 Python语言基础
  7. 我的世界服务器显示器,我的世界红石显示器制作教程 手把手教你做显示器
  8. 手把手教你搭建属于自己的PyQt5-YOLOv5目标检测平台(保姆级教程)
  9. 群狼调研开展出租车神秘顾客调查
  10. mysql中除数为0怎么解决_ora-01476除数为0的解决办法,oracle中decode()的使用