Android开发,关于7.0以上的爬坑记录。

随着Android的版本更迭,现在市面上的手机已经以6.0+为主流,7.0的也越来越多,甚至8.0的手机版本也逐渐开始被各大手机商应用。

本文主要对这些高版本出现的坑进行归纳总结。

1、路径文件读写

这个问题是在7.0开始出现的。

在7.0及以上,系统不再允许使用:file:// 对存储中的数据进行读写。

如果你使用了apk内部更新,将apk下载保存在了文件夹只用,再采用fill://去拿apk进行更新的话,就会出错了。

这是非常严重的一个问题,因为可能会导致应用直接断代,无法修改错误。

解决办法有两种,一种是官方推荐的FileProvider

(1)在manifest中添加provider

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.lovexiaoai.myapp">
      <application
          ...>
          <provider
              android:name="android.support.v4.content.FileProvider"
              android:authorities="com.stanny.FileProvider"
              android:grantUriPermissions="true"
              android:exported="false">
              <meta-data
                  android:name="android.support.FILE_PROVIDER_PATHS"
                  android:resource="@xml/filepaths" />
          </provider>
          ...
      </application>
  </manifest>
(2)创建xml文件夹,创建path.xml

<paths>
  <external-path path="images" name="root_path" />
</paths>
(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://这样的格式就可以继续使用了。

不管采用哪一种,都能够完美解决我们的问题。

2、应用内更新权限

这个问题是在Android8.0以上出现的。

从8.0开始,应用类进行apk安装,会发现没有弹出安装界面。

因为8.0需要添加一个权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
请求安装apk的权限。

这个也是非常重要的一个坑,对于不采用应用商店,而是采用自更新的应用来说,一旦没有处理这个问题,和上一个问题一样对应用都是致命的。

3、Notification使用失败

这个问题是出现在了Android 8.0上面

这是因为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。

至此问题解决。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值