Как открыть мое приложение для Android, если в браузере открыта ссылка rss? - PullRequest
11 голосов
/ 04 февраля 2011

Я создаю 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 ]

21 голосов
/ 31 марта 2011

Похоже, эти 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>
7 голосов
/ 02 марта 2011

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

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

<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>
3 голосов
/ 04 февраля 2011

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

Да. Тем не менее:

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

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

1 голос
/ 24 февраля 2011

Может ли быть так, что сервер не отправляет правильный 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"));

Попробуйте:

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