我正在使用内容URI链接内容(更像是启动特定活动)在应用程序和我开发的其他应用程序中,但问题是任何时候从android启动器中选择一个应用程序,其余的URI保留使用那个单一的应用程序打开
我正在使用Linkify类构建uri链接。下面显示了URI的
Pattern inlinkMatcher = Pattern.compile("\\(click[^()]*\\)|\\(you can[^()]*\\)|\\(check here [^()]*\\)");
String inLinkURL = "content://com.n4labs.sexed.providers/hgcontent/";
Pattern inlinkMatcher2 = Pattern.compile("\\(click here to find [^()]*\\)");
Pattern inlinkMatcher3 = Pattern.compile("\\(learn more [^()]*\\)|\\(talk to [^()]*\\)");
boolean yfsinstalled = appInstalledOrNot("com.n4labs.yfs");
String inLinkURL2 = "http://market.android.com/details/?id=com.n4labs.yfs";
if(yfsinstalled)
inLinkURL2 = "content://com.n4labs.yfs.providers/centersearch/";
boolean divainstalled = appInstalledOrNot("com.n4labs.diva");
String inLinkURL3 = "http://market.android.com/details/?id=com.n4labs.diva";
if(divainstalled)
inLinkURL3 = "content://com.n4labs.diva.providers/learn/";
对Linkify的调用
if(yfsinstalled){
Linkify.addLinks(itemController3.paragraphtext, inlinkMatcher2, inLinkURL2);
}
else
{
Linkify.addLinks(itemController3.paragraphtext, inlinkMatcher2, inLinkURL2, null, mentionFilter);
}
if(divainstalled){
Linkify.addLinks(itemController3.paragraphtext, inlinkMatcher3, inLinkURL3);
}
else
{
Linkify.addLinks(itemController3.paragraphtext, inlinkMatcher3, inLinkURL3, null, mentionFilter);
}
Linkify.addLinks(itemController3.paragraphtext, inlinkMatcher, inLinkURL);
每个应用程序中的提供程序都具有相应的权限,并以此方式导出
<provider
android:name="com.n4labs.diva.providers.HealthGuideContentProvider"
android:authorities="com.n4labs.diva.providers"
android:exported="true">
</provider>
如何确保每个URI自动在相应的应用程序中打开,或者至少每次都向用户显示该选项。
我希望我足够清楚。
任何?
感谢。
答案 0 :(得分:0)
您的每个ContentProviders
都报告与这些Uri
值相关联的MIME类型为text/plain
。这是一种非常常见的MIME类型,通常与标准文本文件相关联。
当用户点击任意Uri
个值的链接时,Android会构建ACTION_VIEW
Intent
,MIME类型为text/plain
,并尝试为此启动一个活动,例如文本编辑器。
现在的关键是:这些ContentProviders
实际上为这些Uri
值提供了哪些内容?换句话说,如果我在openInputStream()
上调用ContentResolver
,传递其中一个Uri
值,我会在流中返回哪些数据?
我看到有五种主要可能性:
他们合法地返回纯文本,您确实希望普通文本编辑器成为用户使用该文本的选项。在这种情况下,您的设置很好。请记住,用户可能会选择单击“始终”选项来处理这些Uri
值,因此可能不一定每次都要想要选择活动。毕竟,在这种情况下,您的所有三个活动都可以与所有三个提供商合作,和常规文本编辑器也可以与这些提供商合作。
他们合法地返回纯文本,但除了处理这些Uri
值的活动之外,您真的不需要任何其他内容。在这种情况下,摆脱ContentProviders
,摆脱Linkify
,并将自己的ClickableSpans
添加到文本中,以直接启动您选择的活动。
它们不会返回纯文本,而是以其他格式返回数据,并且您愿意第三方应用程序能够使用该内容。在这种情况下,请将MIME类型(在提供程序和关联的<intent-filter>
中)更改为正确的值,而不是text/plain
。如果您的数据与任何标准数据格式不匹配,这可能涉及您创建自己的自定义“供应商”MIME类型。
openInputStream()
调用会崩溃,因为您的错误ContentProvider
实际上并未为这些Uri
值提供数据。在这种情况下,修复ContentProvider
,然后再次运行此可能性列表。由于您要导出此提供程序,因此需要实际正确实现它。
openInputStream()
调用会崩溃,或者提供程序会返回除纯文本之外的其他内容,但您不打算任何实际使用此内容而非您自己的人。在这种情况下,摆脱ContentProvider
,摆脱Linkify
,并将自己的ClickableSpans
添加到文本中,以直接启动您选择的活动。
我的猜测是你的情况是#2或#5。