5

バックグラウンド

Android O には、ショートカットの動作に関するさまざまな変更があります。

https://developer.android.com/preview/behavior-changes.html#as

問題

Android O の最近の変更によると、ショートカットを作成するブロードキャスト インテントは完全に無視されます。

https://developer.android.com/reference/android/content/Intent.html#ACTION_CREATE_SHORTCUT https://developer.android.com/preview/behavior-changes.html#as

com.android.launcher.action.INSTALL_SHORTCUT ブロードキャストは、プライベートな暗黙的なブロードキャストになったため、アプリに影響を与えなくなりました。代わりに、ShortcutManager クラスの requestPinShortcut() メソッドを使用して、アプリのショートカットを作成する必要があります。

これは、たとえば、作成したアプリやユーザーが使用しているランチャーに関係なく、次のコードが機能しなくなることを意味します。

private void addShortcut(@NonNull final Context context) {
    Intent intent = new Intent().putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(context, MainActivity.class).setAction(Intent.ACTION_MAIN))
            .putExtra(Intent.EXTRA_SHORTCUT_NAME, "HelloWorldShortcut")
            .putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, ShortcutIconResource.fromContext(context, R.mipmap.ic_launcher))
            .setAction("com.android.launcher.action.INSTALL_SHORTCUT");
    context.sendBroadcast(intent);
}

現在、Play ストア自体でさえ、アプリへのショートカットの作成に失敗しています (少なくとも現在のバージョンでは: 80795200 )。Google のランチャーに対してさえ、何もしません。

質問

私はこの API の変更に非常に反対していますが (そして、それについてここここ、およびここに書いています)、それを引き続き機能させるにはどうすればよいか知りたいです。

これにはrequestPinShortcutを使用した API があることは知っていますが、これにはアプリが Android O をターゲットにする必要があります。

私の質問は次のとおりです。アプリが Android API 25 をターゲットにしているとします。Android O でショートカットを作成するにはどうすればよいですか? 新しい API のリフレクションを使用することで可能ですか? もしそうなら、どのように?

4

2 に答える 2

6

私はこれを永遠に打ち負かしているように思えますが...

if(Build.VERSION.SDK_INT < 26) {
    ...
}
else {
    ShortcutManager shortcutManager
        = c.getSystemService(ShortcutManager.class);
    if (shortcutManager.isRequestPinShortcutSupported()) {
        Intent intent = new Intent(
            c.getApplicationContext(), c.getClass());
        intent.setAction(Intent.ACTION_MAIN);
        ShortcutInfo pinShortcutInfo = new ShortcutInfo
            .Builder(c,"pinned-shortcut")
            .setIcon(
                Icon.createWithResource(c, R.drawable.qmark)
            )
            .setIntent(intent)
            .setShortLabel(c.getString(R.string.app_label))
            .build();
        Intent pinnedShortcutCallbackIntent = shortcutManager
            .createShortcutResultIntent(pinShortcutInfo);
        //Get notified when a shortcut is pinned successfully//
        PendingIntent successCallback
            = PendingIntent.getBroadcast(
                c, 0
                , pinnedShortcutCallbackIntent, 0
            );
        shortcutManager.requestPinShortcut(
            pinShortcutInfo, successCallback.getIntentSender()
        );
    }
}

私のために働いています。7.1 で変更があったことは知っていますが、これが機能するかどうかはわかりません。また、上記のランチャーの問題についてもわかりません。
これは、Android 8.0.0 を実行する Samsung Galaxy Tab S3 でテストされました。

githubのホームページに自分自身のショートカットをインストールするだけの簡単なアプリを置きます。これは、Android 8 の前後のバージョンで機能します。Android 8 より前のバージョンでは sendBroadcast メソッドが使用され、後ではピン留めされたショートカットが作成されます。

于 2018-09-17T18:34:05.287 に答える