我的内容Uri继续启动相同的应用程序

时间:2016-12-30 14:15:54

标签: android android-contentprovider applinks

我正在使用内容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自动在相应的应用程序中打开,或者至少每次都向用户显示该选项。

我希望我足够清楚。

任何?

感谢。

1 个答案:

答案 0 :(得分:0)

您的每个ContentProviders都报告与这些Uri值相关联的MIME类型为text/plain。这是一种非常常见的MIME类型,通常与标准文本文件相关联。

当用户点击任意Uri个值的链接时,Android会构建ACTION_VIEW Intent,MIME类型为text/plain,并尝试为此启动一个活动,例如文本编辑器。

现在的关键是:这些ContentProviders实际上为这些Uri值提供了哪些内容?换句话说,如果我在openInputStream()上调用ContentResolver,传递其中一个Uri值,我会在流中返回哪些数据?

我看到有五种主要可能性:

  1. 他们合法地返回纯文本,您确实希望普通文本编辑器成为用户使用该文本的选项。在这种情况下,您的设置很好。请记住,用户可能会选择单击“始终”选项来处理这些Uri值,因此可能不一定每次都要想要选择活动。毕竟,在这种情况下,您的所有三个活动都可以与所有三个提供商合作,常规文本编辑器也可以与这些提供商合作。

  2. 他们合法地返回纯文本,但除了处理这些Uri值的活动之外,您真的不需要任何其他内容。在这种情况下,摆脱ContentProviders,摆脱Linkify,并将自己的ClickableSpans添加到文本中,以直接启动您选择的活动。

  3. 它们不会返回纯文本,而是以其他格式返回数据,并且您愿意第三方应用程序能够使用该内容。在这种情况下,请将MIME类型(在提供程序和关联的<intent-filter>中)更改为正确的值,而不是text/plain。如果您的数据与任何标准数据格式不匹配,这可能涉及您创建自己的自定义“供应商”MIME类型。

  4. openInputStream()调用会崩溃,因为您的错误ContentProvider实际上并未为这些Uri值提供数据。在这种情况下,修复ContentProvider,然后再次运行此可能性列表。由于您要导出此提供程序,因此需要实际正确实现它。

  5. openInputStream()调用会崩溃,或者提供程序会返回除纯文本之外的其他内容,但您不打算任何实际使用此内容而非您自己的人。在这种情况下,摆脱ContentProvider,摆脱Linkify,并将自己的ClickableSpans添加到文本中,以直接启动您选择的活动。

  6. 我的猜测是你的情况是#2或#5。