随着Android的版本更迭,现在市面上的手机已经以6.0+为主流,7.0的也越来越多,甚至8.0的手机版本也逐渐开始被各大手机商应用。
本文主要对这些高版本出现的坑进行归纳总结。
这个问题是在7.0开始出现的。
在7.0及以上,系统不再允许使用:file:// 对存储中的数据进行读写。
如果你使用了apk内部更新,将apk下载保存在了文件夹只用,再采用fill://去拿apk进行更新的话,就会出错了。
这是非常严重的一个问题,因为可能会导致应用直接断代,无法修改错误。
解决办法有两种,一种是官方推荐的FileProvider
(1)在manifest中添加provider
...
(2)创建xml文件夹,创建path.xml
(3)使用Provider构建Uri
Uri photoURI = FileProvider.getUriForFile(context, "cn.stanny.FileProvider", file);
以上是我copy的。。。实在没时间再写个demo,具体可以百度
来看看第二种,第二种比较简单粗暴。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
采用严苛模式,直接判断当前版本是否大于7.0。
之后file://这样的格式就可以继续使用了。
不管采用哪一种,都能够完美解决我们的问题。
这个问题是在Android8.0以上出现的。
从8.0开始,应用类进行apk安装,会发现没有弹出安装界面。
因为8.0需要添加一个权限
请求安装apk的权限。
这个也是非常重要的一个坑,对于不采用应用商店,而是采用自更新的应用来说,一旦没有处理这个问题,和上一个问题一样对应用都是致命的。
这是因为Android8.0在Notification上多了一个类
NotifycationChannel 渠道
其实说白了就是用来分开设置标题文本、以及闪光、振动等等。
在Android8.0上使用老式的Notification时,会发现如下错误
No Channel found for pkg=com.stanny.demo, channelId=null,
会告知你没有找到channel
new Notification.Builder(conntext);
其实我们点进去看源码可以看到:
/**
* @deprecated use {@link Notification.Builder#Notification.Builder(Context, String)}
* instead. All posted Notifications must specify a NotificationChannel Id.
*/
@Deprecated
public Builder(Context context) {
this(context, (Notification) null);
}
已经过期,请使用Notification.Builder(Context, String)这个来代替。
而这里的第二个String类型参数就是我们的渠道id。
在这里,我们需要进行版本判断。
if (Build.VERSION.SDK_INT >= 26) {
NotificationChannel mChannel = new NotificationChannel("my_channel", "my_channel", NotificationManager.IMPORTANCE_HIGH);
// mChannel.setDescription(description);
// mChannel.enableLights(true);
// mChannel.setLightColor(Color.RED);
// mChannel.enableVibration(true);
// mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
notificationManager.createNotificationChannel(mChannel);
cBuilder = new NotificationCompat.Builder(context, "my_channel");
} else {
cBuilder = new NotificationCompat.Builder(context);
}
可以看到当版本号大于26的时候,我们先建立了一个NotificationChannel,并设置给了notificationManager,再使用这个channelid去设置的Builder。
至此问题解决。