Как открыть мое приложение для Android, когда в браузере откроется ссылка rss?

Я создаю rss-агрегатор для своего телефона Android. Я хотел бы иметь возможность подписаться на RSS-канал из браузера, поскольку большинство веб-сайтов имеют подписку через кнопку rss.

Как я могу создать фильтр намерений для получения этих ссылок?

Этот вопрос был схожим и показал, как создать фильтр намерений для обработки ссылок на браузер: Сделать ссылку в браузере Android запустите мое приложение?

Однако я не знаю, как это сделать для rss-каналов. В качестве попытки я попробовал этот фильтр:

<intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:mimeType="application/rss+xml" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> 

Я на правильном пути? На что мне следует фильтровать?

Solutions Collecting From Web of "Как открыть мое приложение для Android, когда в браузере откроется ссылка rss?"

Эти 3 фильтра, похоже, используются GoogleListen и приложениями GoogleReader:

 <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="http"/> <data android:host="*"/> <data android:pathPattern=".*\\.xml"/> <data android:pathPattern=".*\\.rss"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="http"/> <data android:host="feeds.feedburner.com"/> <data android:host="feedproxy.google.com"/> <data android:host="feeds2.feedburner.com"/> <data android:host="feedsproxy.google.com"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="http"/> <data android:mimeType="text/xml"/> <data android:mimeType="application/rss+xml"/> <data android:mimeType="application/atom+xml"/> <data android:mimeType="application/xml"/> </intent-filter> 

Оказывается, существует множество способов создания подкастов, поэтому каждый из них будет работать только для некоторых из них. Для получения желаемого эффекта по большинству подписных ссылок необходимо использовать множество различных фильтров.

Вот некоторые из фильтров, которые я нашел:

 <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="itpc" /> <data android:scheme="pcast" /> <data android:scheme="feed" /> <data android:scheme="rss" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="*" android:pathPattern=".*xml" /> <data android:scheme="http" android:host="*" android:pathPattern=".*rss" /> <data android:scheme="http" android:host="*" android:pathPattern=".*feed.*" /> <data android:scheme="http" android:host="*" android:pathPattern=".*podcast.*" /> <data android:scheme="http" android:host="*" android:pathPattern=".*Podcast.*" /> <data android:scheme="http" android:host="*" android:pathPattern=".*rss.*" /> <data android:scheme="http" android:host="*" android:pathPattern=".*RSS.*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="text/xml" android:scheme="http" /> <data android:mimeType="application/rss+xml" android:scheme="http" /> <data android:mimeType="application/atom+xml" android:scheme="http" /> </intent-filter> 

Я на правильном пути?

Да. Однако:

  • Вам не нужна схема
  • В любом случае вам не хватает android: префикс перед scheme
  • type должен быть android:mimeType

Вот пример приложения , демонстрирующий, среди прочего, ответ на ссылки на файлы PDF.

Может быть, сервер не отправляет правильный миметик?

Эксперимент, добавив:

 <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:host="*" /> <data android:pathPattern=".*\\.rss" /> <data android:pathPattern=".*\\.xml" /> </intent-filter> 

Изменить: немного сложнее составить правильный набор фильтров-намерений, в алгоритме сопоставления много ранних результатов:
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/IntentFilter.java

В вашем случае, mimetype должен точно соответствовать запросу «application / rss + xml», чтобы ваши источники возвращали этот тип mimetype в заголовке сообщения?

  URL url = new URL("http://www.engadget.com/rss.xml"); URLConnection conn = url.openConnection(); System.out.println("Content-Type:"+conn.getHeaderField("Content-Type")); 

Попробуй:

  1. Сделать более широкие фильтры
  2. Добавьте несколько фильтров.