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

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

4 10

4 ответа:

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

Править: Это немного сложно составить правильный набор фильтров намерения, есть много ранних возвратов в сопоставлении algorithm:
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. добавьте несколько фильтров.