主屏幕快捷方式不会添加

时间:2019-01-16 08:14:23

标签: java android xml android-manifest

我正在尝试以编程方式在主屏幕上添加一个简短内容,但无法正常工作。 该代码适用于Oreo及更高版本,但不能低于此版本。

public void addShortcutToHomeScreen() {

        if (ShortcutManagerCompat.isRequestPinShortcutSupported(this)) {

            ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(this, "#1")
                    .setIntent(new Intent(this, ActivityMemes.class).setAction(Intent.ACTION_MAIN)) //!!! intent's action must be set on oreo
                    .setShortLabel("Memeify")
                    .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher))
                    .build();
            ShortcutManagerCompat.requestPinShortcut(this, shortcutInfo, null);

        } else {

            Intent shortcutIntent = new Intent(getApplicationContext(),
                    Activity.class);

            shortcutIntent.setAction(Intent.ACTION_MAIN);

            Intent addIntent = new Intent();
            addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
            addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Name");
            addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                    Intent.ShortcutIconResource.fromContext(getApplicationContext(),
                            R.mipmap.ic_launcher));

            addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
            addIntent.putExtra("duplicate", false);
            getApplicationContext().sendBroadcast(addIntent);

        }
    }

这是我的清单文件。

<activity
            android:name="com.my.package.Activities.Activity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.CREATE_SHORTCUT" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>
        </activity>

请,告诉我我做错了什么,因为我试图修复它并失败了。还有没有比这更好的方法了?任何帮助将不胜感激。

编辑:

在Logcat中找到了它。

2019-01-16 13:27:46.773 735-13377/? W/BroadcastQueue: Permission Denial: broadcasting Intent { act=com.android.launcher.action.INSTALL_SHORTCUT flg=0x10 launchParam=MultiScreenLaunchParams { mDisplayId=0 mBaseDisplayId=0 mFlags=0 } (has extras) } from com.chameleon.memeify (pid=14824, uid=10300) requires com.android.launcher.permission.INSTALL_SHORTCUT due to receiver com.sec.android.app.launcher/com.android.launcher3.home.InstallShortcutReceiver

2 个答案:

答案 0 :(得分:0)

您可以在应用程序类中使用此方法

public void createShortCut() {

            Intent shortcutintent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
            shortcutintent.putExtra("duplicate", false);
            shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
            Parcelable icon = Intent.ShortcutIconResource.fromContext(getApplicationContext(),
                    R.drawable.logo);
            shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
            shortcutintent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(getApplicationContext(), SplashActivity.class));
            sendBroadcast(shortcutintent);

        }
    }

并应用此权限

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />

答案 1 :(得分:0)

如果您使用的是Android 8+,则无法再使用广播,而必须使用ShortcutManager: https://developer.android.com/about/versions/oreo/android-8.0-changes#as

Android 8.0(API级别26)对应用程序快捷方式进行了以下更改:

  • com.android.launcher.action.INSTALL_SHORTCUT广播不再对您的应用产生任何影响,因为它现在是私有的隐式广播。相反,您应该使用ShortcutManager类中的requestPinShortcut()方法创建应用程序快捷方式。
  • ACTION_CREATE_SHORTCUT意图现在可以创建您使用ShortcutManager类管理的应用程序快捷方式。此意图还可以创建不与ShortcutManager交互的旧版启动器快捷方式。以前,此意图只能创建旧版启动器快捷方式。
  • 使用requestPinShortcut()创建的快捷方式以及在处理ACTION_CREATE_SHORTCUT意图的活动中创建的快捷方式现在已成为成熟的应用程序快捷方式。因此,应用程序现在可以使用ShortcutManager中的方法更新它们。
  • 旧版快捷键保留了早期版本Android的功能,但您必须在应用程序中手动将其转换为应用程序快捷键。 要了解有关更改应用程序快捷方式的更多信息,请参见Pinning Shortcuts and Widgets feature guide