gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:49:36 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com