自分の(意図)から別のアプリケーションを開く


136

私は自分のプログラムを更新する方法を知っています。また、事前定義されたUriを使用してプログラムを開く方法を知っています(SMSや電子メールなど)。

MyTracksまたは他のアプリケーションがどのようなインテントをリッスンしているかわからない場合に、それらを開くためのインテントを作成する方法を知る必要があります。

この情報はDDMSから取得しましたが、これを使用可能なインテントに変換することに成功していません。これは、MyTracksを手動で開いたときに取得されます。

ご協力いただきありがとうございます

05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks bnds=[243,338][317,417] }
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.android.maps.mytracks for activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids={3003, 1015}
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)

回答:


141

まず、Androidの「アプリケーション」の概念は、少し拡張されたものです。

アプリケーション(技術的にはプロセス)は、複数のアクティビティ、サービス、コンテンツプロバイダー、および/またはブロードキャストリスナーを持つことができます。それらの少なくとも1つが実行されている場合、アプリケーションは稼働しています(プロセス)。

したがって、特定する必要があるのは、「アプリケーションを起動する」方法です。

わかりました...これはあなたが試すことができるものです:

  1. action=MAINとでインテントを作成するcategory=LAUNCHER
  2. PackageManagerを使用して現在のコンテキストからを取得しますcontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)インテントがある場所category=LAUNCHERaction=MAINまたはpackageManager.resolveActivity(<intent>, 0)メイン/ランチャーで最初のアクティビティを取得する場所
  4. ActivityInfo興味のあるものを入手
  5. ActivityInfo取得packageName及びname
  6. 最後に、とで別の意図を作成しcategory=LAUNCHERaction=MAINcomponentName = new ComponentName(packageName, name)およびsetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. 最後に、 context.startActivity(newIntent)

3つの個別のアプリを開きたい場合はどうすればよいですか?
Si8 2013


呼び出し元のアプリと起動したアプリの間でデータをどのようにやり取りできますか?「Intent.putExtra()」を見つけましたが、起動したアプリで追加のデータを取得する方法がわかりません。
Bram

onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }etc
Gaurav Vaish 2013年

2
getPackageManager().getLaunchIntentForPackage()すでにあなたがいることをすべて行い github.com/android/platform_frameworks_base/blob/master/core/...
jrub

231

私はこのようにそれを持っています、

/** Open another app.
 * @param context current Context, like Activity, App, or Service
 * @param packageName the full package name of the app to open
 * @return true if likely successful, false if unsuccessful
 */
public static boolean openApp(Context context, String packageName) {
    PackageManager manager = context.getPackageManager();
    try {
        Intent i = manager.getLaunchIntentForPackage(packageName);
        if (i == null) {
            return false;
            //throw new ActivityNotFoundException();
        }
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
        return true;
    } catch (ActivityNotFoundException e) {
        return false;
    }
}

使用例:

openApp(this, "com.google.android.maps.mytracks");

それが誰かを助けることを願っています。


5
getLaunchIntentForPackage( "app package name")が例外を引き起こす可能性があるためです。
xtr

これは素晴らしい答え、シンプルなキャッチ例外で、あなたが必要なもの、などをユーザーに通知しない
IT・ダン

5
スティックになることはありませんが、getLaunchIntentForPackage呼び出しの結果を使用する場合、最初の行に新しいインテントを割り当てる理由はありません。
クリスレイシー

2
getLaunchIntentForPackage():すでにカテゴリを追加して、ソースを参照github.com/android/platform_frameworks_base/blob/master/core/...
jrub

96
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(intent);

編集:

コメントで提案されているように、前に1行追加します startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
ただし、アクティビティの名前を知る必要があります
njzk2 '18

これを試してみたところ、FLAG_ACTIVITY_NEW_TASKフラグの使用を推奨するエラーが発生しました。startActivityの前に次の行を追加し、それが機能しました:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze 2013

1
@ njzk2は、Google Playで何かのパッケージ名を見つけるのは簡単です。URLのすぐそこにあります。例えば:play.google.com/store/apps/...
ダジン

@iceybobbyはい、パッケージ名は見つけやすいですが、起動するアクティビティのクラス名をどのように見つけますか?
phreakhead 2015年

@phreakheadそうですね。私はこの答えでソリューションを使用したと思います:stackoverflow.com/a/8944286/1224186アクティビティ名は必要なかったので、ここではnjzk2への返信が役に立たないと思います。
Da-Jin

39

アクティブ化するパッケージ名がすでにある場合は、少し一般的な次のコードを使用できます。

PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
    context.startActivity(appStartIntent);
}

MAINアクティビティを開始する通常の方法でメインアクティビティが見つからなかった場合に、よりうまく機能することがわかりました。


私にとってのベストアンサー:-)私にとっては役に立ちます。ありがとう
Jalpesh Khakhi 16年

私にはぴったりです。ムジカント、どうもありがとうございました:)
Alex

13

これは、MasterGauravソリューションに基づく私のソリューションベースのコードです。

private void  launchComponent(String packageName, String name){
    Intent launch_intent = new Intent("android.intent.action.MAIN");
    launch_intent.addCategory("android.intent.category.LAUNCHER");
    launch_intent.setComponent(new ComponentName(packageName, name));
    launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    activity.startActivity(launch_intent);
}

public void startApplication(String application_name){
    try{
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);

        for(ResolveInfo info:resolveinfo_list){
            if(info.activityInfo.packageName.equalsIgnoreCase(application_name)){
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                break;
            }
        }
    }
    catch (ActivityNotFoundException e) {
        Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
    }
}

10

逆からのソリューションを使用して、目的のアプリケーションが現時点でインストールされていないときに呼び出される関数を使用してスニペットを拡張しました。したがって、次のように機能します。パッケージ名でアプリケーションを実行します。見つからない場合は、Androidマーケットを開きます-このパッケージのGoogle Play

public void startApplication(String packageName)
{
    try
    {
        Intent intent = new Intent("android.intent.action.MAIN");
        intent.addCategory("android.intent.category.LAUNCHER");

        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);

        for(ResolveInfo info : resolveInfoList)
            if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
            {
                launchComponent(info.activityInfo.packageName, info.activityInfo.name);
                return;
            }

        // No match, so application is not installed
        showInMarket(packageName);
    }
    catch (Exception e) 
    {
        showInMarket(packageName);
    }
}

private void launchComponent(String packageName, String name)
{
    Intent intent = new Intent("android.intent.action.MAIN");
    intent.addCategory("android.intent.category.LAUNCHER");
    intent.setComponent(new ComponentName(packageName, name));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    startActivity(intent);
}

private void showInMarket(String packageName)
{
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

そしてそれはこのように使用されます:

startApplication("org.teepee.bazant");

6

これを使って :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);

何か考えがありますか?既存のアプリケーション内のデバイスストアにインストールする代わりにtest.apkを開きます。既存のプロジェクトに保存されているボタンランチtest.apkアプリをクリックしたときのヒント。事前に感謝します。
Selim Raza 2015

6

存在する場合はアプリケーションを開くか、インストールするためにPlayストアアプリケーションを開きます。

private void open() {
    openApplication(getActivity(), "com.app.package.here");
}

public void openApplication(Context context, String packageN) {
    Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
    if (i != null) {
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.startActivity(i);
    } else {
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
        }
        catch (android.content.ActivityNotFoundException anfe) {
            context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
        }
    }
}

if(i!= null)
vallllll 2017

4

アプリケーションアクティビティから別のアプリケーションアクティビティを開始するには それは私にとってはうまくいきます。

以下のコードは、別のアプリケーションがすでに電話にインストールされている場合は機能します。そうでない場合、1つのアプリケーションから別のアプリケーションにリダイレクトすることはできません。

Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);

同じ質問とほとんど同じである複数の回答を書かないでください。回答の下にある「編集」リンクを使用して、オリジナルを変更してください。
AdrianHHH 2015年

3

//これはAndroid Lollipop 5.0.2で動作します

public static boolean launchApp(Context context, String packageName) {

    final PackageManager manager = context.getPackageManager();
    final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
    appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
    if ((null != resolveInfos) && (!resolveInfos.isEmpty())) {
        for (ResolveInfo rInfo : resolveInfos) {
            String className = rInfo.activityInfo.name.trim();
            String targetPackageName = rInfo.activityInfo.packageName.trim();
            Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
            if (packageName.trim().equals(targetPackageName)) {
                Intent intent = new Intent();
                intent.setClassName(targetPackageName, className);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
                Log.d("AppsLauncher", "Launching Package '" + packageName + "' with Activity '" + className + "'");
                return true;
            }
        }
    }
    return false;
}

2

アプリケーションでは多くの電話設定を変更できないため、他のアプリケーションと同じように設定アクティビティを開くことができます。

実際に設定を手動で変更した後、LogCatの出力を確認します。

INFO/ActivityManager(1306): Starting activity: Intent { act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings } from pid 1924

次に、これを使用してアプリから設定ページを表示します。

String SettingsPage = "com.android.settings/.DevelopmentSettings";

try
{
Intent intent = new Intent(Intent.ACTION_MAIN);             
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));             
intent.addCategory(Intent.CATEGORY_LAUNCHER );             
startActivity(intent); 
}
catch (ActivityNotFoundException e)
{
 log it
}

2

APIレベル3以上の場合、コードは1行にすぎません。

Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");

CATEGORY_INFO起動インテント(ランチャーアクティビティのないアプリ、壁紙など)を返し、見つからない場合は、パッケージのCATEGORY_LAUNCHを返します(存在する場合)。


2

アクティビティではなくサービスを開始しようとしている場合、これは私にとってうまくいきました:

Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);

他の回答で述べたようにintent.setComponent(...)メソッドを使用すると、「startServiceを使用した暗黙のインテントは安全ではありません」という警告が表示される場合があります。


2

または、次のコマンドを使用して、他のアプリでアプリのインテントを開くこともできます。

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

uri他のアプリへのディープリンクはどこですか


2

以下を使用:

String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));

2

Android上の別のアプリケーションからアプリケーションを起動する

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);

2

別のアプリケーションを開きたいがインストールされていない場合は、Google App Storeに送信してダウンロードできます。

  1. たとえば、最初にopenOtherAppメソッドを作成します

    public static boolean openOtherApp(Context context, String packageName) {
        PackageManager manager = context.getPackageManager();
         try {
            Intent intent = manager.getLaunchIntentForPackage(packageName);
            if (intent == null) {
                //the app is not installed
                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 (ActivityNotFoundException e) {
                    //throw new ActivityNotFoundException();
                    return false;
                }
    
             }
             intent.addCategory(Intent.CATEGORY_LAUNCHER);
             context.startActivity(intent);
             return true;
        } catch (ActivityNotFoundException e) {
            return false;
        }
    
    }

2.-使い方

openOtherApp(getApplicationContext(), "com.packageappname");

0

このコードを試してください、これがあなたを助けることを願っています。このパッケージが利用可能な場合は、アプリを開くか、ダウンロード用にPlayストアを開きます

    String  packageN = "aman4india.com.pincodedirectory";

            Intent i = getPackageManager().getLaunchIntentForPackage(packageN);
            if (i != null) {
                i.addCategory(Intent.CATEGORY_LAUNCHER);
                startActivity(i);
            } else {
                try {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
                }
                catch (android.content.ActivityNotFoundException anfe) {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
                }
            }


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.