Как открыть мое приложение для 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>

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

Ответ 1

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

Вот некоторые из найденных мной фильтров:

<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>

Ответ 2

Эти 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>

Ответ 3

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

Да. Однако:

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

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

Ответ 4

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

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

<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"));

Попробуйте:

  • Создание более широких фильтров
  • Добавить несколько фильтров.