【问题标题】:How to open my app implicitly with my scheme?如何使用我的方案隐式打开我的应用程序?
【发布时间】:2018-06-26 16:38:38
【问题描述】:

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

所以,在我的应用“A”中,我定义了意图过滤器

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

我做错了什么?

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

欢迎提问

EDIT1

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

例外

原因:android.content.ActivityNotFoundException:未找到处理 Intent 的 Activity { act=android.intent.action.VIEW dat=mobileapp://applink pkg=package.name.of.destination.app }

【问题讨论】:

  • 你好,尝试设置launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);或者更好的尝试使用this method
  • 这个异常看起来和你的IntentFilter 一点关系都没有。向我们展示您的OnClickListenerXML 布局。你在使用数据绑定吗?
  • @Darwind 在问题中添加了 EDIT 部分,不,我不使用 DataBinding

标签: java android android-intent intentfilter


【解决方案1】:

PackageManager.getLaunchIntentForPackage(String) 的文档指出:

返回在包中启动前门活动的“良好”意图。例如,这用于在浏览包时实现“打开”按钮。当前实现首先在Intent.CATEGORY_INFO 类别中查找主要活动,然后在Intent.CATEGORY_LAUNCHER 类别中查找主要活动。如果两者都没有找到,则返回 null

如果您不遵守本合同,LaunchIntent 将为空,因此您会崩溃。

通常,您的清单中定义了一个主启动器意图过滤器:

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

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

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

【讨论】:

  • 添加了有问题的编辑部分
  • 当然。你试过这个实现吗?对你有用吗?
  • 但是我已经用 Android St 检查了这个 URI,在顶部有标签 app 我点击了它然后 EditConfiguration 然后在 Launch Options 我选择了 Default Activity -> @ 987654334@ 使用此过滤器参数mobileapp://applink 并且我的应用程序已打开。你明白我的想法了吗?
  • 您是如何在 gradle 文件中定义应用程序 ID 的?你试过不使用包的代码吗?
  • 是的,它有效:) 谢谢!但奇怪...有 2 个地方定义了包 1 - 是清单,2- 是 gradle。它们是一样的。
猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多