Android 安卓名称明确意图不解析为其他活动
我有两个应用程序可以相互配合使用。我想创建一个从应用程序B启动应用程序a的按钮,因此我正在创建一个类似于应用程序B中的意图:Android 安卓名称明确意图不解析为其他活动,android,android-intent,android-manifest,intentfilter,Android,Android Intent,Android Manifest,Intentfilter,我有两个应用程序可以相互配合使用。我想创建一个从应用程序B启动应用程序a的按钮,因此我正在创建一个类似于应用程序B中的意图: Intent intent = new Intent("com.org.orgmobile.android.action.ACTION_CUSTOM"); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.setData(Uri.parse(url)); startActivity(intent); 其中u
Intent intent = new Intent("com.org.orgmobile.android.action.ACTION_CUSTOM");
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.setData(Uri.parse(url));
startActivity(intent);
其中url
是https://org.org.com/mobile/Support/action/org/ActionEnumValue/?a=123
我在应用程序A的清单中声明的意图过滤器如下所示:
<intent-filter>
<action android:name="com.org.orgmobile.android.action.ACTION_CUSTOM"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="https"/>
<data android:host="org.org.com"/>
<data android:pathPrefix="/mobile/Support/action/${manifestplaceholderattr}.*/ActionEnumValue/*"/>
</intent-filter>
我在这里俯瞰什么?我尝试使用pathPattern
代替路径前缀,但没有成功
编辑:为了提供更多的细节,我不只是想启动特定的活动,我想匹配与该活动相关联的特定意图来启动活动。我不想直接启动活动,因为如果用户的应用程序已过期,因为它将没有所需的行为。通过Package manager执行此操作的最佳方法如下
PackageManager manager = getPackageManager();
try {
Intent intent = manager.getLaunchIntentForPackage("app B package name here");
if (intent == null)
throw new PackageManager.NameNotFoundException();
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
软件包管理器检查是否安装了具有给定软件包名称的应用程序,如果存在,它将启动应用程序,否则它将抛出NameNotFoundException您需要使用以下代码使用自定义操作启动其他应用程序
Intent intent = new Intent();
intent.setAction("com.org.orgmobile.android.action.ACTION_CUSTOM");
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.setData(Uri.parse(url));
startActivity(intent);
还要确保两个应用程序都已安装。此外,最好进行如下检查,以确保手机上存在用于处理此类意图的应用程序
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
您需要使用
pathPattern
而不是pathPrefix
。此外,您应该在模式末尾使用*
而不是*
:
<data android:pathPattern="/mobile/Support/action/${manifestplaceholderattr}.*/ActionEnumValue/.*"/>
这也可能不起作用。如果我记得,pathPattern
不是真正的正则表达式,您可能无法像这样匹配URL。试试看。如果这不起作用,您可能只需要依赖路径的第一部分。让我知道进展如何
查看
路径
、路径模式
和路径前缀
能否提供错误消息的完整版本。我在问题中添加了堆栈跟踪,但没有提供更多的见解是的,我实际上希望看到这部分的完整版本:dat=https://org.org.com/... flg=0x20000000}
我在调试器中捕捉到了它,不幸的是,这就是你的AndroidManifest的更多内容。捕捉到的是,我不只是想在存在包的情况下启动它,我想完全匹配意图过滤器。如果用户的客户端版本较旧,不支持此操作,则我不想启动该活动该意图仍无法解析为其他应用程序的活动。我在这里不知所措。
<data android:pathPattern="/mobile/Support/action/${manifestplaceholderattr}.*/ActionEnumValue/.*"/>