我有应用程序“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 categoryIntent.CATEGORY_LAUNCHER
. Returnsnull
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/