Мой контент Uri продолжает запускать одно и то же приложение

Я использую URI контента для связывания контента (точнее, запуска определенного действия) в приложении и других приложениях, которые я разработал, но проблема в том, что каждый раз, когда одно приложение выбирается из панели запуска Android, остальные URI продолжают открываться с помощью этого единственное приложение

Я строю URI-ссылки, используя класс Linkify. Ниже показаны 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 ответ

Каждый из ваших ContentProviders сообщает, что тип MIME, связанный с этими Uri значения text/plain, Это очень распространенный тип MIME, обычно ассоциируемый со стандартными текстовыми файлами.

Когда пользователь нажимает на ссылку для любого из этих Uri значения, Android будет строить ACTION_VIEWIntentдля 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 к тексту, чтобы непосредственно начать деятельность по вашему выбору.

Я предполагаю, что ваш случай № 2 или № 5.

Другие вопросы по тегам