Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中从另一个应用程序启动活动_Java_Android_Kotlin_Android Intent - Fatal编程技术网

Java 如何在Android中从另一个应用程序启动活动

Java 如何在Android中从另一个应用程序启动活动,java,android,kotlin,android-intent,Java,Android,Kotlin,Android Intent,我想从我的Android应用程序启动一个已安装的软件包。我认为使用意图是可能的,但我没有找到一种方法。是否有一个链接,在哪里可以找到信息?如果您知道数据和安装的软件包响应的操作,您只需在启动之前将这些信息添加到您的intent实例中即可 如果您有权访问其他应用程序的AndroidManifest,您可以在那里看到所有需要的信息。我找到了解决方案。在应用程序的清单文件中,我找到了包名:com.package.address和要启动的主活动名:MainActivity 以下代码启动此应用程序: In

我想从我的Android应用程序启动一个已安装的软件包。我认为使用意图是可能的,但我没有找到一种方法。是否有一个链接,在哪里可以找到信息?

如果您知道数据和安装的软件包响应的操作,您只需在启动之前将这些信息添加到您的intent实例中即可


如果您有权访问其他应用程序的AndroidManifest,您可以在那里看到所有需要的信息。

我找到了解决方案。在应用程序的清单文件中,我找到了包名:com.package.address和要启动的主活动名:MainActivity 以下代码启动此应用程序:

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

如果您不知道主活动,则可以使用包名称启动应用程序

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

我知道这已经得到了回答,但下面是我如何实现类似的东西:

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);
}

下面是我的例子,如果有人觉得条形码/二维码扫描器有用,我会从我的应用程序中启动它

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();
}

启动新活动的步骤如下:

1.获取包装的意图

2.如果意图为空,则将用户重定向到playstore

3.如果意图不为空,则打开活动

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);
    }
}

如果您想打开另一个应用程序的特定活动,我们可以使用它

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下载所需的应用程序。

根据评论进行编辑

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found
}
在某些版本中(如注释所示),抛出的异常可能不同

因此,下面的解决方案稍作修改

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等。

可以根据文档使用启动应用程序的活动

private fun openOtherApp() {
        val sendIntent = packageManager.getLaunchIntentForPackage("org.mab.dhyanaqrscanner")
        startActivity(sendIntent)
        finishAffinity()
    }
例如:

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)
相关答案请尝试下面的代码:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("package_name", "Class_name"));
if (intent.resolveActivity(getPackageManager()) != null) 
{
   startActivity(intent);
}

由于kotlin现在变得非常流行,我认为在kotlin中提供一个简单的解决方案也是合适的

    var launchIntent: Intent? = null
    try {
        launchIntent = packageManager.getLaunchIntentForPackage("applicationId")
    } catch (ignored: Exception) {
    }
    if (launchIntent == null) {
        startActivity(Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")))
    } else {
        startActivity(launchIntent)
    }
在科特林

fun openApplicationOrMarket(packageName: String) {
        var intent = requireContext().packageManager.getLaunchIntentForPackage(packageName)
        if (intent == null) {
            intent = Intent(Intent.ACTION_VIEW)
            intent.data = Uri.parse("market://details?id=$packageName")
        }

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        requireContext().startActivity(intent)
    }


谢谢你的回复。是的,我有另一个应用程序的AndroidManifest。我现在尝试做的是以下代码:Intent Intent=newintent(Intent.ACTION\u MAIN);setComponent(新组件名(“com.package”,“.MainActivity”);星触觉(意向);但这样做是行不通的。你能给我一个更精确的链接,怎么做?应用程序在“startActivity…”行崩溃:应用程序意外停止。请再试一次。我在哪里可以看到LogCat中的错误?我发现了错误:在设置组件时,必须将完全限定的类名命名为:intent.setComponent(新组件名(“com.package”,“com.package.MainActivity”))而不是intent.setComponent(新组件名(“com.package”,“.MainActivity”))很高兴知道。。。您可以在eclipse上找到LogCat:Window>ShowView>Other,Android>Logcat@WarrenFaith我需要支持,请帮忙。有什么原因说明这不起作用吗?至少我没有让它工作。它开始了一个新的意图,恢复后台的应用程序怎么样?@andep:当我在自己创建的两个应用程序之间进行测试时,这对我来说很有效。一旦我知道了软件包名称,这将一直有效,或者有没有办法阻止某人启动你的应用程序(在maniefest或其他地方)?@Leonard:我的第一印象是,它必须一直有效,因为软件包名称是公开的,所以任何应用程序都可以读取它们。从您的应用程序中,我认为您无法确定从何处调用它,但您的应用程序可以确定不能仅通过服务通过主活动调用它。是的,这可以返回null。“当前实现首先查找类别
类别\u信息
中的主要活动,然后查找类别
类别\u启动器
中的主要活动。如果两者均未找到,则返回null。”我在启动Facebook或Twitter配置文件的意图时遇到问题。它们是在我的应用程序中打开的,而不是作为一项新活动。添加FLAG\u ACTIVITY\u NEW\u任务修复了这个问题。谢谢没问题!我遇到了一些非常类似的问题,这种方法对我来说很有效,但有时新的应用程序是开放的,调用活动仍然是前景。有没有办法解决这个问题?有没有办法从即时应用程序中解决?只适用于发布版本。如果您试图打开调试应用程序,意图将为空。如果我从第一个应用程序打开第二个应用程序,然后直接单击第二个应用程序的图标,会发生什么情况,我会得到该应用程序的两个实例,这是不需要的。如何管理它?“i Get exception”的可能重复“您是否在清单中声明活动.xml”这样会返回一个异常,表示我需要在清单中声明活动。。但它是一个外部应用程序!如何在后台运行它?意味着第二个调用的应用程序不会显示在屏幕上,而是运行其onCreated()方法。当我尝试使用即时应用程序时出现此错误:不允许启动活动Intent@Bastian如何从调用intent的位置关闭当前应用程序以打开另一个应用程序?uri.parse方法是否有字符限制?
PackageManager.getLaunchIntentForPackage(…)
方法如果无法识别包名,则返回null。它不会抛出
PackageManager.NameNotFoundException
。请参阅。我刚刚在Android 10模拟器上尝试了
startActivity(null)
,它抛出了
NullPointerException
,而不是
PackageManager.NameNotFoundException
。在我的注释7中,它的工作方式与预期完全相同。
startActivity(Intent I)的预期行为是什么
fun openApplicationOrMarket(packageName: String) {
        var intent = requireContext().packageManager.getLaunchIntentForPackage(packageName)
        if (intent == null) {
            intent = Intent(Intent.ACTION_VIEW)
            intent.data = Uri.parse("market://details?id=$packageName")
        }

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        requireContext().startActivity(intent)
    }