Android 在手机桌面上创建应用快捷方式图标

开发者 2024-9-20 15:11:09 6 0 来自 中国
一、目标结果:在手机桌面上天生一个和普通应用图标一样的图标,然后用户点击这个图标时,进入对应的应用中(固然你也可以给这个图标点击进入其他的app,重要根据你设置的包名而定)
知道了需求,现在直接上代码,也可以看官网阐明:<a href="https://developer.android.google.cn/guide/topics/ui/shortcuts/creating-shortcuts?hl=zh-cn">创建快捷方式</a>
二、下面我直接把代码贴出来,用作记载,以备后用
    /**     * 添加桌面快捷方式     */    @Throws(Exception::class)    fun addShortcut(context: Context, build: AppInfoBean,id:String): String {        val enter = getAppEnter(context,build.appPackageName)        val uuid = id        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {            if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {                //构建点击intent                val shortcutInfoIntent = Intent().apply {                    action = Intent.ACTION_VIEW                    setClassName(build.appPackageName, enter)                    addCategory(Intent.CATEGORY_LAUNCHER)                    flags = Intent.FLAG_ACTIVITY_NEW_TASK                    putExtra("duplicate", false)//不允许重复创建                }                //构建快捷方式信息                val pinShortcutInfo = ShortcutInfoCompat.Builder(context, uuid)                    .setShortLabel(build.appName)                    .setActivity(ComponentName(context, IconNUllActivity::class.java))                    .setIcon(IconCompat.createWithBitmap(AppComUtil.drawableToBitmap(build.icon)))                    .setIntent(shortcutInfoIntent)                    .build()                //回调intent                val successCallback = PendingIntent.getBroadcast(                    context, 1000, Intent(context, IconAddCallbackReceiver::class.java),                    PendingIntent.FLAG_UPDATE_CURRENT                )                //添加                ShortcutManagerCompat.requestPinShortcut(                    context,                    pinShortcutInfo,                    successCallback.intentSender                )            }        } else {            //构建点击intent            val shortcutInfoIntent = Intent().apply {                action = Intent.ACTION_VIEW                setClassName(build.appPackageName.toString(), enter)                addCategory(Intent.CATEGORY_LAUNCHER)                putExtra("duplicate", false)//不允许重复创建                //设置点击快捷方式,进入指定的Activity                //注意:由于是从Lanucher中启动,以是这里用到了ComponentName                //此中new ComponentName这里的第二个参数,是Activity的全路径名,也就是包名类名要写全。                component = ComponentName(build.appPackageName.toString(), enter)                flags = Intent.FLAG_ACTIVITY_NEW_TASK            }            //给Intent添加 对应的flag            val resultIntent = Intent().apply {                // Intent.ShortcutIconResource.fromContext 这个就是设置快捷方式的图标                putExtra(Intent.EXTRA_SHORTCUT_ICON, AppComUtil.drawableToBitmap(build.icon))                //启动的Intent                putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutInfoIntent)                //这里可以设置快捷方式的名称                putExtra(Intent.EXTRA_SHORTCUT_NAME, build.appName.toString())                //设置Action                action = "com.android.launcher.action.INSTALL_SHORTCUT"            }            //发送广播、关照体系创建桌面快捷方式            context.sendBroadcast(resultIntent)        }        return ""    }三、阐明:
1、AppInfoBean 为须要创建的应用实体bean,包罗应用的名称,应用的包名,已经应用的icon 在获取应用icon时,一样寻常是Drawable 范例,
2、getAppEnter(context,build.appPackageName) 这个方法是通过包名,获取应用的启动页Activity的全包名路下面会给出代码
3、参数id 实在就是在创建每个快捷方式时,须要给每个快捷方式一个id 这里任意天生一个uuid 你可以在应用实体类中给每个应用老师成一个id 确保id唯一,由于同一个id,在桌面上只能天生一个快捷方式
4、IconNUllActivity 这是创建的一个空缺的activity,内里啥也没有,用来在Manifest.xml中设置,处置惩罚快捷方式天生时,图标右下角有当前应用的标志问题,下面也会给出设置
5、AppComUtil.drawableToBitmap(build.icon) 这个简朴,就是把Drawable 图 转成bitmap
6、IconAddCallbackReceiver 是一个注册在Manifest.xml的 广播,内里没什么东西,只在广播的onReceive 中打印log 吸收当一个快捷方式创建完成后,会在这里提示,创建一个,会有一个广告吸收。你可以在这里处置惩罚其他的逻辑
四、根本都在这里了,下面在给出上面的部门缺少的内容
,实体bean自己创建,不给了,
getAppEnter方法:
    /**     * 通过包名获取app的入口activity     */    @SuppressLint("WrongConstant")    fun getAppEnter(context: Context, packageName: String): String {        var mainAct = ""        try {            val intent = Intent().apply {                action = Intent.ACTION_MAIN                addCategory(Intent.CATEGORY_LAUNCHER)            }            val list =                context.packageManager.queryIntentActivities(intent, PackageManager.GET_ACTIVITIES)            list.forEach {                if (TextUtils.equals(it.activityInfo.packageName, packageName)) {                    mainAct = it.activityInfo.name                }            }        } catch (ex: Exception) {        } finally {            return mainAct        }    }五、IconNUllActivity 在Manifest.xml 的设置信息
<activity            android:name=".ui.activity.IconLucencyActivity"            android:configChanges="keyboardHidden|orientation|screenSize|uiMode"            android:excludeFromRecents="true"            android:exported="true"            android:icon="@drawable/bg_transparent"            android:label="@string/app_name"            android:launchMode="singleInstance"            android:noHistory="true"            android:roundIcon="@drawable/bg_transparent"            android:theme="@android:style/Theme.Translucent">            <intent-filter>                <action android:name="android.intent.action.VIEW" />                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>bg_transparent这个是自界说的一个全透明的drawable 自己看着写
到这里就竣事了。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 20:27, Processed in 0.122321 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表