【问题标题】:Android: Get Installed ShortcutsAndroid:获取安装的快捷方式
【发布时间】:2011-09-06 00:12:45
【问题描述】:

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

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

【问题讨论】:

    标签: android shortcut picker


    【解决方案1】:

    这是在启动器中的操作方式...

    Intent shortcutsIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
    List<ResolveInfo> shortcuts = getPackageManager().queryIntentActivities(shortcutsIntent, 0);
    

    【讨论】:

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

    快捷方式是 Launcher 专用的。没有 API,您尝试执行的任何操作都将非常脆弱,因为不同的启动器实现(和版本)将具有不同的存储结构。

    【讨论】:

    • 我看到一些应用想出了一种方法来做到这一点,而无需成为启动器。我知道这将涉及获取类别替代中的意图。但是,如果启动所述快捷方式的意图具有嵌套选项怎么办?例如,您选择设置快捷方式,然后启动一堆其他选项,您希望为其设置快捷方式。我知道有一种方法,我想反射是一个不好用的词。我只需要想办法在类别中获取这些快捷方式,获取意图并在用户在我的应用程序中执行某些操作时启动它们:/
    • @SemperGumbee:“我已经看到一些应用想出了一种无需启动器就能做到这一点的方法”——随便说一下。 “我知道这将涉及获取类别替代方案中的意图。” - AFAIK你错了。查找支持LAUNCHER 类别的活动是启动器用来查找可启动活动的操作。 ALTERNATIVE 类别现在用的不多,AFAIK 与快捷方式无关。
    • @CommonsWare 感谢您提供信息。我发现可以做到这一点的一个应用是 SwipePad。现在,我不知道开发人员做了什么来让快捷方式工作。对于在我的应用程序中启动的应用程序,我只需填充 CATEGOTY_LAUNCHER 类别和 ACTION_MAIN 中的应用程序列表,并获取包名称并将它们存储在首选项中以供以后启动。我可以在这里完善我的意图以找到快捷方式吗?
    【解决方案3】:

    除了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
    

    【讨论】:

      【解决方案4】:

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

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

       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);
      

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

      【讨论】:

      • 看起来你只是在创建一个快捷方式,然后将广播发送到启动器。我需要找到已经可用的快捷方式。它们可能因每个设备而异,所以我只想要一种方法来获取所有可用的快捷方式,并让我的用户选择一个稍后启动。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多