targetSdkVersion提高到26,需要注意的问题,日常记录

1.权限问题

  • 权限申请框架推荐,但是每个框架都有或多或少的问题,特别是相对于国产机器

PermissionsDispatcher

PermissionsDispatcher

RxPermissions

RxPermissions

easypermissions

easypermissions

targetSdkVersion提高到26,需要注意的问题,日常记录_第1张图片
危险权限附表

targetSdkVersion提高到26,需要注意的问题,日常记录_第2张图片
EasyPermissionsEx权限申请流程图

此处需要注意,当有需要危险权限的地方,必须先判断权限,再走相关的方法。还有当用户勾选不再提示并且拒绝的话,下一次我们还要弹出权限申请!

2.应用安装

  • 方法
    private void onInstallApk(String apkPath) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", new File(apkPath));  // 这个地方 关键
            Intent install = new Intent(Intent.ACTION_VIEW);
            install.setDataAndType(apkUri, "application/vnd.android.package-archive");
            install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
            context.startActivity(install);
        } else {
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.setDataAndType(Uri.parse("file://" + new File(apkPath).toString()),
                    "application/vnd.android.package-archive");
            context.startActivity(i);
        }

    }
  • 在res文件夹下新建xml文件夹,然后在xml文件夹中新建files_paths.xml
    files_paths.xml


    
        
        
        
    

具体含义请自行了解

  • AndroidManifest.xml中
   
            
        

android:name对应FileProvider类的包名类名
android:authorities一般为包名+".provide"
android:resource为刚才新建的"@xml/files_paths"

3.Notification

推荐[guolin]的这篇文章
Android通知栏微技巧,8.0系统中通知栏的适配

创建通知渠道
让通知显示出来
以百度导航官方的demo,通知为例ForegroundService .java

public class ForegroundService extends Service {

    private static final String TAG = "ForegroundService";
    private static final int RES_ID = R.layout.activity_navigation;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        String channelId = "my_service";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            createNotificationChannel("my_service", "My Background Service");
        }
//显示广播
        Notification notification = new Notification();
        try {
            NotificationCompat.Builder builder =
                    new NotificationCompat.Builder(this, channelId);
//            Intent intent = new Intent(this, LiteActivity.class);
//            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
//                    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
//            PendingIntent pendingIntent =
//                    PendingIntent.getActivity(this, 0, intent, 0);
            notification = builder.setSmallIcon(R.mipmap.ic_launcher).setTicker("正在导航")
                    .setWhen(System.currentTimeMillis())
                    .setContentTitle("正在导航")
                    .setContentText("百度地图")
                    .build();
        } catch (Throwable e) {
            e.printStackTrace();
        }

        startForeground(RES_ID, notification);
    }
//创建通知渠道
    @RequiresApi(Build.VERSION_CODES.O)
    private void createNotificationChannel(String channelId, String channelName) {
        NotificationChannel chan = new NotificationChannel(channelId,
                channelName, NotificationManager.IMPORTANCE_NONE);
        chan.setLightColor(Color.BLUE);
        chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        assert manager != null;
        manager.createNotificationChannel(chan);
    }
}

4.接收不到广播

Android 8.0 系统接收不到广播的终极解决方案

解决方法:

  • 1.尽量使用动态广播代替静态广播
  • 2.如果动态广播不能满足你的需求,必须要使用静态广播的话,那么就得在 Intent 中设置参数 Component参数,然后其他注册广播的步骤和原来在 Android 6.0 系统以下注册的方法一样。

5.其他

提升targetSdkVersion至26+适配概要(转)

你可能感兴趣的:(targetSdkVersion提高到26,需要注意的问题,日常记录)