代码之家  ›  专栏  ›  技术社区  ›  Sirop4ik

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

  •  1
  • Sirop4ik  · 技术社区  · 7 年前

    我有一个应用程序“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)
    

    我做错什么了?

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

    随便问吧

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

    例外

    原因:android.content.activityNotFoundException:找不到处理intent{act=android.intent.action.view dat=mobileapp://applink pkg=package.name.of.destination.app}的活动

    1 回复  |  直到 7 年前
        1
  •  1
  •   tynn    7 年前

    文件 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");