专栏首页技术小屋-未分类Android——《Android第一行代码》10.6节服务的最佳实践,应用8.0以上Android系统需要修改的地方

Android——《Android第一行代码》10.6节服务的最佳实践,应用8.0以上Android系统需要修改的地方

【背景】:参照书籍写的代码,辛苦写完,分析完原理,运行起来确有很多,解决这些问题,查了大量的资料,走了很多弯路,最后仅通过一个基本知识点解决,写在这里,记录下来,后来者参考了,少走些弯路。

【问题】:先从遇到的问题说起

1、程序运行,直接闪退。

——Android 8.0以上系统使用通知,需要添加渠道,详见另一篇博文

2、刚运行,没有操作别的,就出现异常卡死问题,再次打开APP,开始下载,程序闪退,查看logcat,是需要申请前台服务权限,所以在AndroidMainfest.xml中添加:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

3、点击下载,出现程序提示的download failed提示,跟踪logcat,确认为存储权限没有获取,所以无法下载成功。

java.io.FileNotFoundException: /storage/emulated/0/Download/ : open failed: EAC(Permission denied)

这个问题根据网上一些办法在程序中都有,比如下,但是都没有效果,依然不好使。

1)AndroidMainfest.xml 添加权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

2)动态申请权限

if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}

3)build.gradle中Android闭包加入:

compileOptions{
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

【最终解决方案】:

最后,想到是不是 还是  Android版本的问题,把build.gradle中的 targetSdkVersion 改低一些(原来是29),我试了23 、26,重新运行,都好使(去掉上述的问题2-3的解决方法也OK),更奇怪的是改完后,再改回29,程序运行依然好使,把虚拟机恢复出厂设置,再用targetSdkVersion=29,就不好使了,怀疑是targetSdkVersion较低时,再虚拟机中已经打开了必要的权限,所以再改回到29,程序运行依然好使。

关于build.gradle中的 minSdkVersion和targetSdkVersion意义,找了一篇博文,讲的通俗易懂,原文连接,内容我摘出来如下,仅做学习参考应用:

minSdkVersion和targetSdkVersion相信很多人都不太理解,我在网上也看了许多关于这两者区别的文章,感觉说的都很模糊,直到我在stackOverFlow看到Android Min SDK Version vs. Target SDK Version这篇文章后,我才终于弄清楚如何去设置minSdkVersion和targetSdkVersion,现在我将分享给大家。

简言之,这篇文章的目的是为了区分minSDK和targetSDK,这两者相当于一个区间,你可以用到targetSDK中最新的API和最酷的新功能,但你又不得不向下兼容到minSDK,保证这个区间内的设备都可以正常的运行你的app。换句话说,你想使用Android刚刚推出的新特性,但这对于你的app又不是必须的,你就可以将targetSDK设置为你想使用新特性的SDK版本,minSDK设置成低版本保证所有人都可以使用你的app。

举一个例子:假如你想给你的app加入大量的手势操作(sdk 7才引入的),然而这些手势操作可以被Button啊或menu等代替,在这种情况下,手势操作就是一个额外的加分功能,而不是一个必须的功能,因此你就需要把targetSDK设置为7,把minSDK设置为3(这是举个例子,现在没人还在用这么老的设备了)这样即使是使用老设备的用户也可以用你的app了。然后你所要做的就是要在代码里判断版本,如果是大于等于7的版本中就使用手势操作,小于7的版本中就使用button等代替,这样使用了新手机的用户就可以体验到你app中酷炫的新功能了。

另外一个例子:如果你想给你的项目加入Android 5.0的Material Design,有一些用户可能会升级到5.0而使用到你的新特性,而有一部分用户的手机硬件太老,不支持升级到5.0,除非他们换新手机,那么你就要为他们进行向下兼容,不至于损失这部分用户,这样你的targetSDK设置为21,minSDK可以设置为8。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux——Ubuntu系统挂载硬盘方法总结(开机自动挂载)

    可以看到,当前有两个硬盘,/dev/sda是原来的40G硬盘,/dev/sdb是刚才新建的5G硬盘,“Disk /dev/sdb doesn't contain...

    Winter_world
  • Android——《Android第一行代码》中使用通知 方法,Android8.0系统NotificationCompat.builder()方法的使用及引导用户开启通知

    1、该书中使用的Android版本较老,8.0以下,没有渠道这一说法,所以使用的高版本Android系统,需要进行适配,即判断本机系统是否在8.0以上,是的话,...

    Winter_world
  • Android——NORDIC nRF5x系列 DFU升级 APP实现

    2、AndroidMainfest.xml中申请BLE的相关权限、读写权限、定位等。

    Winter_world
  • Android O 新特性和行为变更总结

    多窗口是 Android 7.1 之后引入的(关于多窗口适配需要注意的地方,但是趁此机会了解一下 Android O 版本的新特性也不错,而且 Google I...

    QQ音乐技术团队
  • Linux系列教程(十九)——Linux文件系统管理之手工分区

      上篇博客我们首先介绍了硬盘为什么要分区,以及Linux系统的几种分区类型,然后介绍了Linux系统几个常用的文件系统命令,最后讲解了挂载命令,并通过实例演示...

    IT可乐
  • 【转】Android开发在路上:少去踩坑,多走捷径

    本文是我订阅“腾讯大讲堂”公众帐号时,他们推送的一篇文章,但在腾讯大讲堂官网上我并没有找到这篇文章,不过其它专门“爬”公众号文章的网站倒是有。我觉得写的很不错。...

    meteoric
  • Unity编译Android的原理解析和apk打包分析

    最近由于想在Scene的脚本组件中,调用Android的Activity的相关接口,就需要弄明白Scene和Activity的实际对应关系,并对Unity调用A...

    张坤
  • Android自动化构建之Ant多渠道打包实践(下)

    用户1130025
  • python中__name__的意义以及作用

    这里打印了两次,第一次实在main.py在进行import test的时候,进行的打印,第二次才是test.HaveFun()中执行的打印,可以发现,这里的 ...

    OLDPAN
  • 快速打开Github某个commit页面的方法

    url格式:https://github.com/SAP/spartacus/commit/

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券