Мой контент 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_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.