java - 如何使用我的方案隐式打开我的应用程序?

标签 java android android-intent intentfilter

我有应用程序“A”,需要通过隐式 Intent 从其他应用程序“B、C、D”打开

所以,在我的应用程序“A”中,我定义了 Intent 过滤器

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>

    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <!-- Accepts URIs that begin with "example://gizmos” -->
    <data
        android:host="applink"
        android:scheme="mobileapp"/>
</intent-filter>

在应用“B”中我已经定义了隐式 Intent

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("package.name.of.destination.app");
startActivity(LaunchIntent);

我得到这样的错误

2018-06-26 19:35:44.155 2270-2270/com.example.ezplan.deleteit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ezplan.deleteit, PID: 2270
java.lang.IllegalStateException: Could not execute method for android:onClick
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25883)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6642)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
    at android.view.View.performClick(View.java:6597) 
    at android.view.View.performClickInternal(View.java:6574) 
    at android.view.View.access$3100(View.java:778) 
    at android.view.View$PerformClick.run(View.java:25883) 
    at android.os.Handler.handleCallback(Handler.java:873) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6642) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Intent.migrateExtraStreamToClipData()' on a null object reference
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1666)
    at android.app.Activity.startActivityForResult(Activity.java:4584)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:792)
    at android.app.Activity.startActivityForResult(Activity.java:4542)
    at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:779)
    at android.app.Activity.startActivity(Activity.java:4903)
    at android.app.Activity.startActivity(Activity.java:4871)
    at com.example.ezplan.deleteit.MainActivity.doOnCLickButton(MainActivity.java:29)

我做错了什么?

或者,给我一个正确的例子

欢迎提问

编辑1

1)我需要打开的应用程序中的过滤器

<intent-filter>
            <action android:name="android.intent.action.VIEW"/>

            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <!-- Accepts URIs that begin with "mobileapp://applink” -->
            <data
                android:host="applink"
                android:scheme="mobileapp"/>
        </intent-filter>

2) 我在应用程序中尝试调用外部应用程序的代码

public void testit(View view)
{
    Intent LaunchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("mobileapp://applink"))
            .setPackage("package.name.of.destination.app");

    startActivity(LaunchIntent);
}

异常

Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=mobileapp://applink pkg=package.name.of.destination.app }

最佳答案

PackageManager.getLaunchIntentForPackage(String) 的文档状态:

Returns a "good" intent to launch a front-door activity in a package. This is used, for example, to implement an "open" button when browsing through packages. The current implementation looks first for a main activity in the category Intent.CATEGORY_INFO, and next for a main activity in the category Intent.CATEGORY_LAUNCHER. Returns null if neither are found.

如果您不遵守此契约(Contract),LaunchIntent 将为 null,因此您会崩溃。

通常您在 list 中定义了一个主启动器 Intent 过滤器:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

这将由 getLaunchIntentForPackage() 找到。在不更改或添加您已定义的 Intent 过滤器的情况下,您还可以创建适当的 Intent 以手动匹配它:

Intent LaunchIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("mobileapp://applink"))
                            .setPackage("package.name.of.destination.app");

关于java - 如何使用我的方案隐式打开我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51047734/

相关文章:

android - 如果我将 List<Child> 放入一个 Intent 中,那么我会从另一个 Activity 中检索 List<Parent>

java - 从 Libgdx 渲染方法启动 Android Intent

java - Bukkit/Spigotplugin - 从配置中删除条目

javascript - Android 缩放 javascript

java - DateTime compareTo 不适用于 DateTime

Android mysql-connector-java 库

android - firebase 云消息传递中*未送达*消息的数量是否有限制?

java - 尝试在 Android 应用程序(java)上设置静音按钮

java - 系统剪贴板仅在应用程序内

java - 如何创建一个自动更改其字体大小以适应空间的 TextView ?