Android——《Android第一行代码》10.6节服务的最佳实践,应用8.0以上Android系统需要修改的地方
【背景】:参照书籍写的代码,辛苦写完,分析完原理,运行起来确有很多,解决这些问题,查了大量的资料,走了很多弯路,最后仅通过一个基本知识点解决,写在这里,记录下来,后来者参考了,少走些弯路。
【问题】:先从遇到的问题说起
1、程序运行,直接闪退。
——Android 8.0以上系统使用通知,需要添加渠道,详见另一篇博文。
2、刚运行,没有操作别的,就出现异常卡死问题,再次打开APP,开始下载,程序闪退,查看logcat,是需要申请前台服务权限,所以在AndroidMainfest.xml中添加:
3、点击下载,出现程序提示的download failed提示,跟踪logcat,确认为存储权限没有获取,所以无法下载成功。
java.io.FileNotFoundException: /storage/emulated/0/Download/ : open failed: EAC(Permission denied)
这个问题根据网上一些办法在程序中都有,比如下,但是都没有效果,依然不好使。
1)AndroidMainfest.xml 添加权限
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。
更多相关文章
- 应用程序如何获取系统权限
- Android(安卓)API Guides---Text and Input
- Android应用程序插件化研究之AssertManager
- Android的联通性---USB主机模式(二)
- android中如何读取已经在sqlite expert professional等sqlite工
- Android数据库更新onupgrade
- [置顶] 基于Proxy思想的Android插件框架
- Android(安卓)下开发3D程序--我的坎坷路(一)
- Android(安卓)API Guides---Building Web Apps in WebView