写点什么

Android6,阿里 P8 大佬亲自教你

用户头像
Android架构
关注
发布于: 刚刚

| SENSORS | android.permission.BODY_SENSORS | || SMS | android.permission.SEND_SMS | || | android.permission.RECEIVE_SMS | || | android.permission.READ_SMS | || | android.permission.RECEIVE_WAP_PUSH | || | android.permission.RECEIVE_MMS | || STORAGE | android.permission.READ_EXTERNAL_STORAGE | || | android.permission.WRITE_EXTERNAL_STORAGE | |


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


以上是列出 9 组需要动态申请的权限,建议自己代码统一封装成一个工具类,这里就不细说了, Android6.0权限工具

3.Android 7.0 的适配

3.1 应用间共享文件


在 targetSdkVersion 大于等于的 24 的 App 中,但是我们没有去适配 7.0。那么在调用安装页面,或修改用户头像操作时,就会失败。那么就需要你去适配 7.0 或是将 targetSdkVersion 改为 24 以下(不推荐)。适配的方法这里就不细讲,大家可以看鸿洋大神的 Android 7.0 行为变更 通过FileProvider在应用间共享文件这篇文章


3.2 APK signature scheme v2


Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。



1)只勾选 v1 签名就是传统方案签署,但是在 7.0 上不会使用 V2 安全的验证方式。


2)只勾选 V2 签名 7.0 以下会显示未安装,7.0 上则会使用了 V2 安全的验证方式。


3)同时勾选 V1 和 V2 则所有版本都没问题。


3.3 org.apache 不支持问题


// build.gradle 里面加上这句话 defaultConfig {useLibrary 'org.apache.http.legacy'}


3.3 SharedPreferences 闪退


SharedPreferences read = getSharedPreferences(RELEASE_POOL_DATA, MODE_WORLD_READABLE);//MODE_WORLD_READABLE :7.0 以后不能使用这个获取,会闪退,修改成 MODE_PRIVATE

4.Android 8.0 的适配

4.1 安卓 8.0 中 PHONE 权限组新增两个权限


ANSWER_PHONE_CALLS:允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用 acceptRingingCall() 函数。READ_PHONE_NUMBERS :权限允许您的应用读取设备中存储的电话号码。


4.2 通知适配


安卓 8.0 中,为了更好的管制通知的提醒,不想一些不重要的通知打扰用户,新增了通知渠道,用户可以根据渠道来屏蔽一些不想要的通知


兼容的代码


/**


  • 安卓 8。0 通知的兼容类哦,

  • NotifyCompatYc yc : 是雨辰的简写,谢谢哦,嘿嘿 ----高贵的子信*/public class NotifyCompatYc {


public static final String QFMD_CHANNEL_ID = "com.oms.mingdeng";public static final String QFMD_CHANNEL_NAME = "祈福明燈";public static final String LJMS_DEFAULT_CHANNEL_NAME = "靈機妙算";public static final String LJMS_CHANNEL_ID = "com.oms.mmcnotity";public static final String XYS_CHANNEL_ID = "com.oms.xuyuanshu";public static final String XYS_CHANNEL_NAME = "許願樹";


public static void setONotifyChannel(NotificationManager manager, NotificationCompat.Builder builder, String channeId, String channelName) {if (TextUtils.isEmpty(channeId)||TextUtils.isEmpty(channelName)){L.e("NotifyCompatYc: ".concat("安卓 8.0 的通知兼容库中 channeId 与 channelName 不能为 empty"));}if (Build.VERSION.SDK_INT >= 26) {//第三个参数设置通知的优先级别 NotificationChannel channel =new NotificationChannel(channeId, channelName, NotificationManager.IMPORTANCE_DEFAULT);channel.canBypassDnd();//是否可以绕过请勿打扰模式 channel.canShowBadge();//是否可以显示 icon 角标 channel.enableLights(true);//是否显示通知闪灯 channel.enableVibration(true);//收到小时时震动提示 channel.setBypassDnd(true);//设置绕过免打扰 channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_SECRET);channel.setLightColor(Color.RED);//设置闪光灯颜色 channel.getAudioAttributes();//获取设置铃声设置 channel.setVibrationPattern(new long[]{100, 200, 100});//设置震动模式 channel.shouldShowLights();//是否会闪光 if (manager != null) {manager.createNotificationChannel(channel);}if (builder != null) {builder.setChannelId(channeId);//这个 id 参数要与上面 channel 构建的第一个参数对应}}}


public static void setONotifyChannel(NotificationManager manager, String channeId, String channelName) {setONotifyChannel(manager,null,channeId,channelName);}


public static Notification getNotification(Context context, String channelId) {NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId);Notification notification = notificationBuilder.setOngoing(true).setSmallIcon(R.drawable.ic_launcher).setPriority(NotificationManager.IMPORTANCE_MIN).setCategory(Notification.CATEGORY_SERVICE).build();return notification;}}


public class NotifyManager {


// 单例开始 private volatile static NotifyManager INSTANCE;


private NotifyManager(Context context) {initNotifyManager(context);}


public static NotifyManager getInstance(Context context) {if (INSTANCE == null) {synchronized (NotifyManager.class) {if (INSTANCE == null) {INSTANCE = new NotifyManager(context);}}}return INSTANCE;}// 单例结束


private NotificationManager manager;// NotificationManagerCompatprivate NotificationCompat.Builder builder;


//初始化通知栏配置 private void initNotifyManager(Context context) {context = context.getApplicationContext();manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);// 如果存在则清除上一个消息// manager.cancel(news_flag);builder = new NotificationCompat.Builder(context,NotifyCompatYc.QFMD_CHANNEL_ID);


NotifyCompatYc.setONotifyChannel(manager,builder,NotifyCompatYc.QFMD_CHANNEL_ID,NotifyCompatYc.QFMD_CHANNEL_NAME);


// 设置标题 builder.setContentTitle(context.getResources().getString(R.string.qfmd_notify_title1));// 状态栏的动画提醒语句 builder.setTicker(context.getResources().getString(R.string.qfmd_notify_ticker));// 什么时候提醒的 builder.setWhen(System.currentTimeMillis());// 设置通知栏的优先级 builder.setPriority(Notification.PRIORITY_DEFAULT);// 设置点击可消失 builder.setAutoCancel(true);// 设置是否震动等 builder.setDefaults(Notification.DEFAULT_VIBRATE);// 设置 iconbuilder.setSmallIcon(R.drawable.lingji_icon);// 设置点击意图 Intent intent = new Intent(context, GongdenggeActivity.class);Bundle bundle = new Bundle();bundle.putBoolean(Contants.INTENT_GOTO_MYLMAP, true);intent.putExtras(bundle);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PendingIntent pendingIntent = PendingIntent.getActivity(context, 230, intent, PendingIntent.FLAG_UPDATE_CURRENT);builder.setContentIntent(pendingIntent);}


/**


  • 显示祈福明灯过期通知*/public void showQiFuLampOutOfDateNotify(Context context) {// 设置内容 builder.setContentText(context.getResources().getString(R.string.qfmd_notify_content1));manager.notify(13251, builder.build());}


public void showQiFuLampBlessNotify(Context context) {builder.setContentText(context.getResources().getString(R.string.qfmd_notify_content2));manager.notify(13255, builder.build());}}


4.3 安装 APK


首先在 AndroidManifest 文件中添加安装未知来源应用的权限:

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android6,阿里P8大佬亲自教你