web-dev-qa-db-ja.com

Androidホーム画面にショートカットを作成

私がやりたいことは:

1)アクティビティ内にいます。2つのボタンがあります。最初のボタンをクリックすると、ホーム画面にショートカットが作成されます。ショートカットは、以前にダウンロードされたhtmlページを開くので、デフォルトのブラウザを使用したいのですが、すでにページを持っているのでインターネットを使用したくありません。

2)2番目のボタンは、アクティビティを開始する別のショートカットを作成します。そして、私はアクティビティにいくつかの追加の引数を渡したいです(例えば文字列として)...........

それらは可能ですか? Android:ホーム画面にWebショートカットを作成するプログラミング方法はありますか のようなリンクと同様の質問をいくつか見つけました。

彼らは私の質問への答えのようですが、誰かがこのコードはすべてのデバイスで動作するわけではなく、それは非推奨であり、私がやりたいことは不可能だと教えてくれました...

この手法は推奨されません。これは内部実装であり、Android SDKの一部ではありません。すべてのホーム画面の実装では動作しません。Androidのすべての過去のバージョンで動作しない可能性があります。将来のバージョンでは動作しない可能性がありますGoogleは内部のドキュメント化されていないインターフェースを維持する義務を負わないため、Androidを使用します。これは使用しないでください。

内部実装とはどういう意味ですか?そのコードは信頼できるかどうか..... help me pls .....

56
Sgotenks

サンプルコードでは、ドキュメント化されていないインターフェイス(許可と意図)を使用してショートカットをインストールします。 「誰か」が言ったように、これはすべての電話で動作しない可能性があり、将来的に壊れる可能性がありますAndroidリリース。それをしないでください。

正しい方法は、ホーム画面からのショートカットリクエストをリッスンすることです。マニフェストでそのようなインテントフィルターを使用します。

<activity Android:name=".ShortCutActivity" Android:label="@string/shortcut_label">
  <intent-filter>
    <action Android:name="Android.intent.action.CREATE_SHORTCUT" />
    <category Android:name="Android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

次に、インテントを受け取るアクティビティで、ショートカットのインテントを作成し、アクティビティ結果として返します。

// create shortcut if requested
ShortcutIconResource icon =
    Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);

Intent intent = new Intent();

Intent launchIntent = new Intent(this,ActivityToLaunch.class);

intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, someNickname());
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);

setResult(RESULT_OK, intent);
83
antlersoft

Android Homescreen [自分のアプリでテスト済み]にショートカットアイコンを作成する方法を1つ開発しました。それを呼び出してください。

private void ShortcutIcon(){

    Intent shortcutIntent = new Intent(getApplicationContext(), MainActivity.class);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Test");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher));
    addIntent.setAction("com.Android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);
}

アクティビティ名、アイコンリソース、許可を変更することを忘れないでください。

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

ハッピーコーディング!!!

編集:

重複する問題の場合、最初のオプションはコードの次の行を追加することです。それ以外の場合は、毎回新しい行が作成されます。

addIntent.putExtra("duplicate", false);

2番目のオプションは、最初にアプリのショートカットアイコンをアンインストールし、最初のオプションが機能しなかった場合に再度インストールすることです。

66

Android oreo。 [〜#〜] link [〜#〜] 以来、com.Android.launcher.action.INSTALL_SHORTCUTブロードキャストは効果がなくなりました。

すべてのAndroidバージョン、特にAndroid 8.0またはoreo以降をサポートする場合は、以下のコードを使用して作成しますショートカット:

public static void addShortcutToHomeScreen(Context context)
{
    if (ShortcutManagerCompat.isRequestPinShortcutSupported(context))
    {
        ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
                .setIntent(new Intent(context, YourActivity.class).setAction(Intent.ACTION_MAIN)) // !!! intent's action must be set on oreo
                .setShortLabel("Test")
                .setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher))
                .build();
        ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
    }
    else
    {
        // Shortcut is not supported by your launcher
    }
}

マニフェストファイルに権限を追加します。

<uses-permission Android:name="com.Android.launcher.permission.INSTALL_SHORTCUT"/>
9
Q Locker

上記のソリューションを少し改善しました。現在は、ショートカットが既に追加されているかどうかを設定に保存し、ユーザーが削除した場合、アプリの新しい起動時に追加しません。これにより、既存のショートカットを追加するコードが実行されなくなるため、少し時間が節約されます。

final static public String PREFS_NAME = "PREFS_NAME";
final static private String PREF_KEY_SHORTCUT_ADDED = "PREF_KEY_SHORTCUT_ADDED";


// Creates shortcut on Android widget screen
private void createShortcutIcon(){

    // Checking if ShortCut was already added
    SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    boolean shortCutWasAlreadyAdded = sharedPreferences.getBoolean(PREF_KEY_SHORTCUT_ADDED, false);
    if (shortCutWasAlreadyAdded) return;

    Intent shortcutIntent = new Intent(getApplicationContext(), IntroActivity.class);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    Intent addIntent = new Intent();
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "YourAppName");
    addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher));
    addIntent.setAction("com.Android.launcher.action.INSTALL_SHORTCUT");
    getApplicationContext().sendBroadcast(addIntent);

    // Remembering that ShortCut was already added
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean(PREF_KEY_SHORTCUT_ADDED, true);
    editor.commit();
}
8
wzbozon

Android Oから始まり、これはショートカットを作成する方法です。

            if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) {
                final ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);

                ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(context, shortcutId)
                        .setIcon(Icon.createWithResource(context, R.mipmap.ic_launcher))
                        .setShortLabel(label)
                        .setIntent(new Intent(context, MainActivity.class).setAction(Intent.ACTION_MAIN))
                        .build();
                shortcutManager.requestPinShortcut(pinShortcutInfo, null);
            }

残念ながら、多くの制限があります。

  1. ユーザーが追加を受け入れる必要があります。
  2. バックグラウンドで追加/削除することはできません。
  3. あなたはそれを更新できるはずですが、私にとってはうまくいきませんでした。
  4. 対象のアプリが削除されても削除されません。それを作成したもののみ。
  5. 現在のアプリの場合を除き、ターゲットアプリのリソースに基づいてアイコンを作成することはできません。ただし、ビットマップから実行できます。

Android O以前の場合、ShortcutManagerCompatを使用して、これらの制限なしで新しいショートカットを作成することもできます。

8

API level 26なので、com.Android.launcher.action.INSTALL_SHORTCUTの使用は非推奨です。ショートカットを作成する新しい方法は、 ShortcutManager を使用することです。

静的、動的、および固定の3種類のショートカットがあることに言及しています。要件に基づいて、作成することを選択できます。

3
noob

@Siddiq Abu Bakkar Answerが動作します。ただし、アプリを起動するたびにショートカットが作成されるのを防ぐため、共有設定を使用します。

final String PREF_FIRST_START = "AppFirstLaunch";
 SharedPreferences settings = getSharedPreferences(PREF_FIRST_START, 0);
    if(settings.getBoolean("AppFirstLaunch", true)){

        // record the fact that the app has been started at least once
        settings.edit().putBoolean("AppFirstLaunch", false).commit();
        ShortcutIcon();

    }
2
Krishnadas PC
final Intent shortcutIntent = new Intent(this, SomeActivity.class);

final Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
// Sets the custom shortcut's title
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
// Set the custom shortcut icon
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));
// add the shortcut
intent.setAction("com.Android.launcher.action.INSTALL_SHORTCUT");
sendBroadcast(intent);
1
Piush Kumar
public static void addShortcutToHomeScreen(Context context)
{
    if (ShortcutManagerCompat.isRequestPinShortcutSupported(context))
    {
        ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(context, "#1")
                .setIntent(new Intent(context, YourActivity.class).setAction(Intent.ACTION_MAIN)) // !!! intent's action must be set on oreo
                .setShortLabel("Test")
                .setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher))
                .build();
        ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null);
    }
    else
    {
        // Shortcut is not supported by your launcher
    }
}

私はそれを使用しましたが、ホーム画面上のいくつかのデバイスは2つのアイコンを追加します。理解できませんでした??

0
selçuk doğan