android某个功能和应用快捷方式

2023-12-13 03:30:08

android某个功能和应用快捷方式

最近接受到一个任务,给应用内的一个功能点创建一个快捷方式,方便用户操作快捷、
一,第一种方式,只适用Build.VERSION.SDK_INT>25 以上的版本

   /** shortcutId  快捷方式的标示,自己定义 
     * 固定快捷方式
     *  Build.VERSION.SDK_INT>25以上
     */
   private fun createQuestPinShortcut(context: Context) {

        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
            if (mShortcutManager == null) {
                mShortcutManager = context.getSystemService(ShortcutManager::class.java)
            }
            var isExit = false
            mShortcutManager?.pinnedShortcuts?.forEach {
                if (shortcutId == it.id) {
                    //判断快捷方式是否已存在
                    isExit = true
                    Toast.showToast(context, "快捷方式已存在")
                    return@forEach
                }
            }
            if (mShortcutManager?.isRequestPinShortcutSupported == true && !isExit) {
                val intent = Intent(context, ShortcutAlarmCallActivity::class.java)
                intent.action = shortcutAction
                intent.action = Intent.ACTION_VIEW
                val pinShortcutInfo = ShortcutInfo.Builder(context, shortcutId)
                    .setShortLabel(context.getString(R.string.shortcut_alarm_long))
                    .setLongLabel(context.getString(R.string.shortcut_alarm_long))
                    .setIcon(Icon.createWithResource(context, R.mipmap.icon_alarm_emergency))
                    .setIntent(intent)
                    .build()
                // 注册固定快捷方式成功广播
                val intentFilter = IntentFilter()
                intentFilter.addAction(shortcutBroadcast)
                val receiver = ShoutCutReceiver()
                context.registerReceiver(receiver, intentFilter)
                val flag = PendingIntent.FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT
                val pinnedShortcutCallbackIntent = Intent(shortcutBroadcast)
                val successCallback = PendingIntent.getBroadcast(
                    context,
                    0,
                    pinnedShortcutCallbackIntent,
                    flag
                )
                mShortcutManager?.requestPinShortcut(pinShortcutInfo, successCallback.intentSender)
            }
        }

    }

二、第二种方式 适配android 8以下的版本和以上的版本

  /**
     * 兼容创建快捷方式
     * @param context Context
     */
    open fun addShortCutCompact(context: Context) {
        if (isShortCutExist(context, context.getString(R.string.shortcut_alarm_long))) {
            Toast.showToast(context, "快捷方式已存在")
            return
        }
        if (!ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
            Toast.showToast(context, "无法创建快捷方式")
            return
        }
        val shortcutInfoIntent = Intent()
        shortcutInfoIntent.setClassName(context, className)
        shortcutInfoIntent.action = Intent.ACTION_VIEW //action必须设置,不然报错
        val info = ShortcutInfoCompat.Builder(context, shortcutId)
            .setIcon(IconCompat.createWithResource(context, R.mipmap.icon_alarm_emergency))
            .setShortLabel(context.getString(R.string.shortcut_alarm_long))
            .setIntent(shortcutInfoIntent)
            .build()

        // 注册固定快捷方式成功广播
        val intentFilter = IntentFilter()
        intentFilter.addAction(shortcutBroadcast)
        val receiver = ShoutCutReceiver()
        context.registerReceiver(receiver, intentFilter)
        val pinnedShortcutCallbackIntent = Intent(shortcutBroadcast)
        val flag = PendingIntent.FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT
        //当添加快捷方式的确认弹框弹出来时,将被回调
        val shortcutCallbackIntent = PendingIntent.getBroadcast(
            context,
            0,
            pinnedShortcutCallbackIntent,
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) flag else 0
        )
        ShortcutManagerCompat.requestPinShortcut(
            context,
            info,null)
    }

三、用第二种方式可以用以下方法判断是否存在快捷方式

   /**
     * 判断是否存在快捷方式
     * @param context Context
     * @return Boolean
     */
    private fun isShortCutExist(context: Context, title: String): Boolean {
        var isInstallShortcut = false
        if (TextUtils.isEmpty(title)) {
            return false
        }
        val contentResolver: ContentResolver = context.contentResolver
        try {
            val authority = "com.android.launcher3.settings"
            val url = "content://$authority/favorites?notify=true"
            val contentUrl: Uri = Uri.parse(url)
            val strArray = arrayOf("title", "iconResource")
            val cursor: Cursor? = contentResolver.query(
                contentUrl, strArray, "title=?",
                arrayOf(title.trim()), null
            )
            cursor?.let {
                if (it.count > 0) {
                    isInstallShortcut = true
                }
                if (!it.isClosed) {
                    it.close()
                }
            }
        } catch (e: Exception) {
            e.toString()
        }
        return isInstallShortcut
    }

**

**## 最近要记得添加权限**

**

```kotlin
 <!-- 添加快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <!-- 移除快捷方式 -->
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
    <!-- 查询快捷方式4.4以上 -->
    <uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
    <uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" />

如果要添加创建成功提示`

`class ShoutCutReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Log.i("ShoutCutReceiver", "onReceive: 创建成功")
              Toast.showToast(context, R.drawable.icon_succes_tip,"创建成功")
    }
}

文章来源:https://blog.csdn.net/zhanghuaiwang/article/details/134880336
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。