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

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

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。

更多相关文章

  1. 应用程序如何获取系统权限
  2. Android(安卓)API Guides---Text and Input
  3. Android应用程序插件化研究之AssertManager
  4. Android的联通性---USB主机模式(二)
  5. android中如何读取已经在sqlite expert professional等sqlite工
  6. Android数据库更新onupgrade
  7. [置顶] 基于Proxy思想的Android插件框架
  8. Android(安卓)下开发3D程序--我的坎坷路(一)
  9. Android(安卓)API Guides---Building Web Apps in WebView

随机推荐

  1. 职场 | 工作五年之后,对技术和业务的思考
  2. MySQL修改root密码的多种方法+给远程登录
  3. 苹果Mac最好的视频下载工具:VideoDuke
  4. Mysql+Mycat实现数据库主从同步与读写分
  5. Splunk pipline 管道
  6. yum仓库与sed一般应用
  7. DBA的小学美术功底
  8. 如何使用Safari浏览器的自动创建强密码功
  9. 一文详解RIP路由协议及环路问题!
  10. zookeeper技术介绍