【问题标题】:My Content Uri's keep launching the same application我的内容 Uri 不断启动相同的应用程序
【发布时间】:2016-12-30 14:15:54
【问题描述】:

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

我希望我已经足够清楚了。

有人吗?

谢谢。

【问题讨论】:

  • “每个应用程序中的提供程序都具有适当的权限并被导出”——重要的是提供程序为这些Uri 值和对于您期望那些 Uri 值路由到 ACTION_VIEW 的活动,&lt;intent-filter&gt; 元素是什么样的。
  • MIME 类型为 text/plain,intent 过滤器如下所示:` ` @CommonsWare

标签: android android-contentprovider applinks


【解决方案1】:

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

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

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

我认为主要有五种可能性:

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

  2. 它们合法地返回纯文本,但除了处理那些Uri 值的活动之外,您真的不想要任何东西。在这种情况下,去掉ContentProviders,去掉Linkify,在文本中添加你自己的ClickableSpans,直接开始你选择的活动。

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

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

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

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

【讨论】:

  • 感谢您的帮助。我的情况更多的是#2。然而,问题是我正在使用正则表达式来匹配应该可以点击的文本,因为它们很多。使用 ClickableSpans 需要我单独搜索每个文本并使子字符串可点击。你认为这是正确的做法吗? @CommonsWare
  • @viktour19:“你认为这是正确的方法吗?” -- 是的。
  • 所以我使用了可点击按钮,它为我省去了很多麻烦 - 谢谢
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
相关资源
最近更新 更多