安卓:获取已安装的快捷方式

9

我看到了制作快捷方式的方法,但我需要找到一种获取手机上安装的快捷方式列表的方法。

我希望我的用户能够从我的应用程序中选择他/她的一个快捷方式并启动它。有没有一种方法可以做到这一点(API),或者我需要使用反射方法调用系统服务?

4个回答

5
在启动器中的操作如下:
Intent shortcutsIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
List<ResolveInfo> shortcuts = getPackageManager().queryIntentActivities(shortcutsIntent, 0);

1
尝试了一下,但是不起作用。它只返回了一些Android预设的快捷方式,如浏览器、联系人等。 - Guy
这个解决方案适用于获取复古快捷方式。要从ResolveInfo对象列表中获取信息,请参见以下内容:for (ResolveInfo shortcut: shortcuts){ Log.d("SC", ""+shortcut.activityInfo.applicationInfo.loadLabel(getPackageManager())); Log.d("SC", shortcut.activityInfo.packageName); Log.d("SC", ""+shortcut.loadLabel(getPackageManager())); } - Michael Kern

2

这些快捷方式是专属于 Launcher 的。没有 API,而且任何你试图做的事情都会非常脆弱,因为不同的启动器实现(和版本)将具有不同的存储结构。


我看到一些应用程序提出了一种方法,可以在不成为启动器的情况下实现这一点。我知道这将涉及到获取类别“alternative”中的意图。但是,如果启动所述快捷方式的意图具有嵌套选项怎么办?例如,您选择设置快捷方式,然后启动其他许多选项,以便为哪个设置创建快捷方式。我知道有一种方法,我猜反射是一个不好的词。我只需要找出一种方法来将这些快捷方式放入类别中,获取意图并在用户在我的应用程序中执行某些操作时启动它们 :/ - SemperGumbee
@SemperGumbee:“我看到一些应用程序想出了一种方法,可以在没有启动器的情况下完成这个操作”--请列举一些。“我知道这将涉及到获取替代类别中的意图。”--据我所知,你是错的。查找支持“LAUNCHER”类别的活动是启动器查找可启动活动的方式。现在,“ALTERNATIVE”类别很少使用,据我所知与快捷方式无关。 - CommonsWare
@CommonsWare 谢谢您的信息。我发现一个可以做到这一点的应用程序是 SwipePad。现在,我不知道开发者为了让快捷方式工作所做的事情。对于我的应用程序中的应用程序启动,我只需填充类别为 CATEGOTY_LAUNCHER 和 ACTION_MAIN 的应用程序列表,并获取包名称并将其存储在首选项中以供稍后启动。我能否在此处优化我的 Intent 以查找快捷方式? - SemperGumbee

0

除了 Jonathan之外,

每个应用程序都可以使用快捷方式。每个快捷方式在应用程序清单中指定。因此,您可以获取快捷方式列表(此方法在活动中):
Kotlin

fun printShortcuts() {
    val shortcutIntent = Intent(Intent.ACTION_CREATE_SHORTCUT)
    val shortcuts = packageManager.queryIntentActivities(shortcutIntent, 0)
    shortcuts.forEach {
        println("name = ${it.activityInfo.name}, label = ${it.loadLabel(packageManager)}")
    }
}

它将打印类似以下内容的东西:
I/System.out: name = com.whatsapp.camera.CameraActivity, label = WhatsApp Camera
I/System.out: name = com.android.contacts.ContactShortcut, label = Contact
I/System.out: name = alias.DialShortcut, label = Direct dial
I/System.out: name = alias.MessageShortcut, label = Direct message

-2

我正在尝试做同样的事情,但这个主题有很多不清楚的地方,至少对我来说不清楚...........一个例子是Openapp市场,每次你“下载”一个应用程序时都会创建快捷方式,但实际上快捷方式只是一个指向HTML页面的链接。无论如何,我有两部安卓手机,在第一部手机上可以工作,在第二部手机上没有创建任何快捷方式.......

在我的应用程序中,我执行以下操作:

 Intent shortcutIntent = new Intent(this,FinestraPrincipaleActivity.class);
 shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  shortcutIntent.putExtra("someParameter", "HelloWorld");

 Intent addIntent = new Intent();
 addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
 addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Shortcut Name");
  addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,  
 Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));

addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
 this.sendBroadcast(addIntent);

但是有人告诉我这样做是错误的,但我没有找到其他创建快捷方式的方法...


看起来你只是在创建一个快捷方式,然后将广播发送到启动器。我需要找到已经可用的快捷方式。它们可能因设备而异,所以我只想找到一种方法来获取所有已经可用的快捷方式,并让我的用户选择一个稍后启动。 - SemperGumbee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接