Androidで別のアプリケーションからアクティビティを起動する方法


479

Androidアプリケーションからインストール済みパッケージを起動したいのですが。インテントを使用することは可能だと思いますが、それを行う方法が見つかりませんでした。情報を見つけるためのリンクはありますか?


2
最初のアプリから2番目のアプリを開き、2番目のアプリのアイコンを直接クリックすると、アプリの2つのインスタンスが表示されますが、これは望ましくありません。それを管理する方法は?
Radhey、2014年

回答:


707

主なアクティビティがわからない場合は、パッケージ名を使用してアプリケーションを起動できます。

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found
}

5
これが機能しない理由について何か理由がありますか?少なくとも動作しませんでした。
Simon Forsberg、

22
新しいIntentを開始しますが、バックグラウンドにあるアプリケーションを再開してみませんか?
Salil Dua 2013

3
@andep:自分で作成した2つのアプリ間でテストしたところ、これはうまくいきました。パッケージ名がわかったら、これは常に機能しますか、それとも誰かが(マニフェストまたはどこかで)アプリを起動できないようにする方法はありますか?
Leonard Feehan 2013

2
@Leonard:私の第一印象は、パッケージ名はパブリックなのですべてのアプリが読み取れるため、常に機能する必要があるということです。アプリからは、どこから呼び出されたかは判別できないと思いますが、アプリは、メインアクティビティからはサービスを介してのみ呼び出すことができないと判断できます。
andep 2013

1
はい、これはnullを返す可能性があります。「現在の実装では、最初にカテゴリのメインアクティビティを探しCATEGORY_INFO、次にカテゴリのメインアクティビティを探しますCATEGORY_LAUNCHERどちらも見つからない場合はnullを返します。
quietmint

240

私はこれが答えられたことを知っていますが、これは私が同様の何かを実装する方法です

Intent intent = getPackageManager().getLaunchIntentForPackage("com.package.name");
if (intent != null) {
    // We found the activity now start the activity
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
} else {
    // Bring user to the market or let them choose an app?
    intent = new Intent(Intent.ACTION_VIEW);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setData(Uri.parse("market://details?id=" + "com.package.name"));
    startActivity(intent);
}

さらに良いのは、ここにメソッドがあります:

public void startNewActivity(Context context, String packageName) {
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent != null) {
        // We found the activity now start the activity
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    } else {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse("market://details?id=" + packageName));
        context.startActivity(intent);
    }
}

重複するコードを削除しました:

public void startNewActivity(Context context, String packageName) {
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent == null) {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("market://details?id=" + packageName));
    }
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

8
FacebookまたはTwitterプロファイルへのインテントを開始するときに問題が発生しました。新しいアクティビティとしてではなく、アプリ内で開かれていました。FLAG_ACTIVITY_NEW_TASKを追加することで修正されました。ありがとう!
ハリー

4
問題ない!私は非常によく似た何かで問題を抱えていました
Jared Burrows

1
メソッドは私にとっては機能しますが、新しいアプリケーションが開いていて、呼び出し側のアクティビティがまだフォアグラウンドである場合があります。修正する方法はありますか?
lgdroid57 2014年

Instant-Appからこれを行う方法はありますか?
Mahdi

リリースバージョンでのみ機能します。デバッグアプリを開こうとしている場合、インテントはnullになります。
RexSplode 2018年

152

私は解決策を見つけました。アプリケーションのマニフェストファイルで、パッケージ名com.package.addressと、起動するメインアクティビティの名前を見つけました。MainActivity次のコードは、このアプリケーションを起動します。

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity"));
startActivity(intent);

8
例外が発生しました 'あなたのManifest.xmlでアクティビティを宣言します'
itzhar

この方法では、マニフェストでアクティビティを宣言する必要があるという例外を返しますが、これは外部アプリです。
JJ Ab 2016年

バックグラウンドで実行する方法は?2番目に呼び出されたアプリケーションは画面に表示されませんが、onCreated()メソッドを実行します。
Dr.jacky

Instant Appから試すと、このエラーが表示されます:アクティビティIntent
Mahdi

@Bastian別のアプリを開く意図を呼び出しているところから現在のアプリを閉じる方法は?
アーノルドブラウン

18
// in onCreate method
String appName = "Gmail";
String packageName = "com.google.android.gm";
openApp(context, appName, packageName);

public static void openApp(Context context, String appName, String packageName) {
    if (isAppInstalled(context, packageName))
        if (isAppEnabled(context, packageName))
            context.startActivity(context.getPackageManager().getLaunchIntentForPackage(packageName));
        else Toast.makeText(context, appName + " app is not enabled.", Toast.LENGTH_SHORT).show();
    else Toast.makeText(context, appName + " app is not installed.", Toast.LENGTH_SHORT).show();
}

private static boolean isAppInstalled(Context context, String packageName) {
    PackageManager pm = context.getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException ignored) {
    }
    return false;
}

private static boolean isAppEnabled(Context context, String packageName) {
    boolean appStatus = false;
    try {
        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
        if (ai != null) {
            appStatus = ai.enabled;
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return appStatus;
}

17

これは、誰かが便利だと思ったときに私のアプリからバー/ QRコードスキャナーを起動する私の例です

Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");

try 
{
    startActivityForResult(intent, SCAN_REQUEST_CODE);
} 
catch (ActivityNotFoundException e) 
{
    //implement prompt dialog asking user to download the package
    AlertDialog.Builder downloadDialog = new AlertDialog.Builder(this);
    downloadDialog.setTitle(stringTitle);
    downloadDialog.setMessage(stringMessage);
    downloadDialog.setPositiveButton("yes",
            new DialogInterface.OnClickListener() 
            {
                public void onClick(DialogInterface dialogInterface, int i) 
                {
                    Uri uri = Uri.parse("market://search?q=pname:com.google.zxing.client.android");
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    try
                    {
                        myActivity.this.startActivity(intent);
                    }
                    catch (ActivityNotFoundException e)
                    {
                        Dialogs.this.showAlert("ERROR", "Google Play Market not found!");
                    }
                }
            });
    downloadDialog.setNegativeButton("no",
            new DialogInterface.OnClickListener() 
            {
                public void onClick(DialogInterface dialog, int i) 
                {
                    dialog.dismiss();
                }
            });
    downloadDialog.show();
}

13

コメントに応じて編集

一部のバージョンでは、コメントで提案されているように、スローされる例外が異なる場合があります。

したがって、以下のソリューションはわずかに変更されています

Intent launchIntent = null;
try{
   launchIntent = getPackageManager().getLaunchIntentForPackage("applicationId");
} catch (Exception ignored) {}

if(launchIntent == null){
    startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
} else {
    startActivity(launchIntent);
}

元の回答

よく答えられていますが、アプリがインストールされていない場合に処理するかなり単純な実装があります。こうやって

try{
    startActivity(getPackageManager().getLaunchIntentForPackage("applicationId"));
} catch (PackageManager.NameNotFoundException e) {
    startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
}

「applicationId」をcom.google.mapsなどの開こうとするパッケージに置き換えます。


PackageManager.getLaunchIntentForPackage(...)パッケージ名が認識されない場合、メソッドはNULLを返します。投げませんPackageManager.NameNotFoundException。こちらをご覧ください
アディルフセイン

startActivity(null)はAndroid 10エミュレータを試してみたところ、がスローされ、はスローされNullPointerExceptionませんPackageManager.NameNotFoundException
アディルフセイン

私のノート7では、意図したとおりに動作します。
mayank1513

startActivity(Intent intent)nullが与えられたときのメソッドの意図された動作はIntent何ですか?Android開発者のドキュメントには、がスローされることが記載されていますActivityNotFoundException
アディルフセイン

-こんにちは@Adilあなたはこの質問のヘルプ私を喜ばせることができstackoverflow.com/q/59615815/9640177
mayank1513

7
// check for the app if it exist in the phone it will lunch it otherwise, it will search for the app in google play app in the phone and to avoid any crash, if no google play app installed in the phone, it will search for the app in the google play store using the browser : 

 public void onLunchAnotherApp() {

        final String appPackageName = getApplicationContext().getPackageName();

        Intent intent = getPackageManager().getLaunchIntentForPackage(appPackageName);
        if (intent != null) {

            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);

        } else {

            onGoToAnotherInAppStore(intent, appPackageName);

        }

    }

    public void onGoToAnotherInAppStore(Intent intent, String appPackageName) {

        try {

            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("market://details?id=" + appPackageName));
            startActivity(intent);

        } catch (android.content.ActivityNotFoundException anfe) {

            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName));
            startActivity(intent);

        }

    }

uri.parseメソッドに文字制限はありますか?
API

7

別のアプリケーションの特定のアクティビティを開きたい場合は、これを使用できます。

Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.fuelgauge.PowerUsageSummary");
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try 
{
    startActivity(intent)
}catch(ActivityNotFoundException e){
    Toast.makeText(context,"Activity Not Found",Toast.LENGTH_SHORT).show()
}

他のアプリケーションが必要な場合は、Toastを表示する代わりに、ダイアログを表示できます。ダイアログを使用して、必要なアプリケーションをダウンロードするためにPlay-Storeにユーザーを連れてくることができます。


com.android.settings.fuelgauge.PowerUsageSummaryただで活動エイリアスcom.android.settings.Settings$PowerUsageSummaryActivity、そしてそれがされたAndroidのパイに削除私はこの答えスーツパイを作るために編集をsummittedので、。それはまた、旧バージョンとの互換性だ、AOSPは2011年11月10日af9252849fd94c1f2859c56a4010900ea38a607eなどにコミット見ること注
週末の

3

インストールされているパッケージが反応するデータとアクションがわかっている場合は、開始する前にこれらの情報をインテントインスタンスに追加するだけです。

他のアプリのAndroidManifestにアクセスできる場合は、そこに必要な情報をすべて表示できます。


1
返信いただきありがとうございます。はい、他のアプリケーションのAndroidManifestを持っています。私が今やろうとしているのは次のコードです:Intent intent = new Intent(Intent.ACTION_MAIN); intent.setComponent(new ComponentName( "com.package"、 "。MainActivity")); startActivity(intent); しかし、この方法では機能しません。より正確なリンクを教えていただけますか、それを行う方法を教えてください。
Bastian

1
「startActivity ...」の行でアプリケーションがクラッシュする:アプリケーションが予期せず停止しました。もう一度お試しください。LogCatのどこでエラーを確認できますか?
Bastian

5
私はエラーを見つけました:コンポーネントを設定するとき、クラスだけではなく完全修飾クラス名を指定する必要があります:intent.setComponent(new ComponentName( "com.package"、 "com.package.MainActivity"))代わりに.setComponent(new ComponentName( "com.package"、 "。MainActivity"))
Bastian

1
知っておきたいこと:EclipseでLogCatを見つけることができます:ウィンドウ>ビューを表示>その他、Android> Logcat
WarrenFaith

@WarrenFaith stackoverflow.com/questions/52335402/のサポートが必要です… 助けてください。
user158 2018

2

新しいアクティビティを起動する手順は次のとおりです。

1.パッケージの意図を得る

2.意図がnullの場合、ユーザーをプレイストアにリダイレクトします

3.意図がnullオープンアクティビティでない場合

public void launchNewActivity(Context context, String packageName) {
    Intent intent = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.CUPCAKE) {
        intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    }
    if (intent == null) {
        try {
            intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setData(Uri.parse("market://details?id=" + packageName));
            context.startActivity(intent);
        } catch (android.content.ActivityNotFoundException anfe) {
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
        }
    } else {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }
}

2

Intent.setClassNameドキュメントに従って使用することにより、アプリのアクティビティを開始することが可能です。

例:

val activityName = "com.google.android.apps.muzei.MuzeiActivity" // target activity name
val packageName = "net.nurik.roman.muzei" // target package's name
val intent = Intent().setClassName(packageName, activityName)
startActivity(intent)

現在のアプリの外で開くには、インテントを開始する前にこのフラグを追加します。

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

ここに関連する答え


C ++での記述方法。
GeneCode

1
@GeneCode stackoverflow.com/a/22436147/8608146は、これまでAndroidでC ++ライブラリを使用したことがなかった場合に役立ちます。
Phani Rithvij

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.