我正在尝试以编程方式在主屏幕上添加一个简短内容,但无法正常工作。 该代码适用于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
答案 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。