Я создаю 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>
Я на правильном пути? На что мне следует фильтровать?
Эти 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"));
Попробуй: