IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android -- 快捷方式适配(1) -> 正文阅读

[移动开发]Android -- 快捷方式适配(1)

Android快捷方式不同版本之间开发的方式不一样,而且不同os版本之间的权限申请也不一致,再加上Android本身生态的碎片化导致适配是一件很头疼的事情。下面将介绍一下本人适配过程踩过的坑

1.系统版本适配

7.1之前的快捷方式是通过发送广播的方式:

String ACTION_ADD_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
        Intent addShortcutIntent = new Intent(ACTION_ADD_SHORTCUT);
        // 不允许重复创建,不是根据快捷方式的名字判断重复的
        addShortcutIntent.putExtra(shortCutId, false);
        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label);
        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(context, iconResId));
    
        Intent launcherIntent = new Intent();
        Uri uri = Uri.parse(uriString);
        launcherIntent.setAction(Intent.ACTION_VIEW);
        launcherIntent.setData(uri);
        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);
        // 发送广播
        context.sendBroadcast(addShortcutIntent);

同时需要在AndroidMainfest.xml配置好权限

 <!-- 添加快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <!-- 移除快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

可能为了适配一些三方的桌面系统,还要加一些权限增强健壮性,比如针对qq,360等桌面添加权限,这些权限不是危险权限,加了也不会让用户感知很明显(但是我们当时适配的时候并没有适配这些三方桌面,所以并没有得到可靠的结论,所以就不贴出来了)

7.1后Google推出了新的管理器ShortcutManager,一开始只是可以对桌面久按应用图标弹出的快捷方式进行管理,后来O之后又可以对Pinned Shortcuts(固定快捷方式) 的管理。

API:requestPinShortcut

主要参数:ShortcutInfo,用来设置桌面图标,文案,跳转url等信息

API:isRequestPinShortcutSupported

Note:Return TRUE if the app is running on a device whose default launcher supports requestPinShortcut(ShortcutInfo, IntentSender).

如果是默认支持requestPinShortcut,可以使用,否则用原来的广播创建。

ShortcutManager shortcutManager = (ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
        boolean requestPinShortcutSupported = shortcutManager.isRequestPinShortcutSupported();

        if (requestPinShortcutSupported) {
            Intent shortcutInfoIntent = new Intent();
            Uri uri = Uri.parse(uriString);
            shortcutInfoIntent.setAction(Intent.ACTION_VIEW);
            shortcutInfoIntent.setData(uri);
            ShortcutInfo info = new ShortcutInfo.Builder(context, SHORT_CUT)
                    .setIcon(Icon.createWithResource(context, R.drawable.short_cut_logo))
                    .setShortLabel(label)
                    .setIntent(shortcutInfoIntent)
                    .build();

            //当添加快捷方式的确认弹框弹出来时,将被回调ShortCutReceiver里面的onReceive方法
            PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(context, 0, new Intent(context, ShortCutReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
            shortcutManager.requestPinShortcut(info, shortcutCallbackIntent.getIntentSender());

        }

你以为这样就结束了么?当内部灰度后,又发现了另一个坑。

资源索引导致的图标错乱:

灰度覆盖安装后,我们发现升级完后用户之前创建的快捷方式图标变了(不可预期的),经排查后确认是资源索引改变导致的。

解决方案也呼之欲出:

1.固化图标索引(这个可能和现有的插件化等方案有一些冲突)

2.O以上创建的快捷方式从asset读出来,不用resource

3.经调研后发现,O以上还有个updateShortcuts,可以对原创建的快捷方式进行更改

ShortcutManager shortcutManager = (ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
            if (shortcutManager == null) {
                return;
            }
            boolean requestPinShortcutSupported = shortcutManager.isRequestPinShortcutSupported();
            if (requestPinShortcutSupported) {
                if (CollectionUtil.isEmpty(shortcutManager.getPinnedShortcuts())) {
                    return;
                }
                Intent shortcutInfoIntent = new Intent();
                Uri uri = Uri.parse(uriString);
                shortcutInfoIntent.setAction(Intent.ACTION_VIEW);
                shortcutInfoIntent.setData(uri);

                List<ShortcutInfo> shortcutInfos = new ArrayList<>();

                for (ShortcutInfo shortcutInfo : shortcutManager.getPinnedShortcuts()) {
                    
                    ShortcutInfo info = new ShortcutInfo.Builder(context, TextUtils.isEmpty(shortcutInfo.getId()) ? id : shortcutInfo.getId())
                            .setIcon(Icon.createWithBitmap(bitmap))
                            .setShortLabel(TextUtils.isEmpty(shortcutInfo.getShortLabel()) ? label : shortcutInfo.getShortLabel())
                            .setIntent(shortcutInfo.getIntent() == null ? shortcutInfoIntent : shortcutInfo.getIntent())
                            .build();
                    shortcutInfos.add(info);
                }

                shortcutManager.updateShortcuts(shortcutInfos);
            }

后续还会分享踩坑经历,主要是权限方面的,敬请期待

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:14:29  更:2021-08-20 15:16:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:44:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码