iCal URL 的意图过滤器

7
我正在尝试将我的Android应用程序注册为iCal URL的处理程序。为此,我在清单文件中为webcal://伪协议和使用text/calendar MIME类型的HTTP URL设置了意图过滤器(请参见下面)。
这在模拟器中完全正常,但在真实设备上出现问题。webcal://过滤器有效,但text/calendar却无法生效。相反,浏览器会将ical文件显示为纯文本而不是将URL传递给我的应用程序。
我检查过浏览器没有被配置为ical的默认处理程序(在“设置-》应用程序-》浏览器”中),并且我询问了其他一些人是否可以在他们的手机上重现该问题。结果都是一样的。
那么,注册text/calendar URLs的正确方法是什么?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="org.splitbrain.giraffe"
  android:versionName="0.31" android:versionCode="4">
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.Light.NoTitleBar">
    <activity android:label="@string/app_name" android:name="MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <category android:name="android.intent.category.BROWSABLE"></category>
            <action android:name="android.intent.action.VIEW"></action>
            <data android:mimeType="text/calendar" android:scheme="http"></data>
            <category android:name="android.intent.category.DEFAULT"></category>
        </intent-filter>
        <intent-filter>
            <category android:name="android.intent.category.BROWSABLE"></category>
            <action android:name="android.intent.action.VIEW"></action>
            <data android:scheme="webcal"></data>
            <category android:name="android.intent.category.DEFAULT"></category>
        </intent-filter>
    </activity>
    <activity android:name="OptionsActivity"></activity>
    <activity android:name="DetailActivity"></activity>
    <activity android:name="AboutActivity"></activity>

</application>
</manifest>

更新:事实证明上述方法在Android 1.6模拟器中可以正常工作,但在2.3.3模拟器上却显示与我的手机相同的行为。这可能是Android中的一个错误吗?

服务器是否可能没有准确地发送正确的Content-Type?如果是这样,浏览器可能会将其解释为纯文本。您可以尝试使用路径意图过滤器和正则表达式 *.ical,这样可能会更好一些。 - Greg Giacovelli
是的,服务器发送了正确的MIME类型。这是我用于测试的URL:http://re-publica.de/11/rp2011.ics - Andreas Gohr
你尝试过使用路径参数方法来筛选*.ics文件吗?如果这不起作用,你是否将默认应用程序设置为浏览器,以便它不再提示? - Greg Giacovelli
2个回答

0

只需使用默认类别,可浏览类别可能会导致问题。

添加.*.ics路径模式以捕获服务器错误地给出错误MIME类型的任何文件

将所有匹配的数据放入同一个过滤器中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="org.splitbrain.giraffe"
  android:versionName="0.31" android:versionCode="4">
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.Light.NoTitleBar">
    <activity android:label="@string/app_name" android:name="MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/calendar" />
            <data android:scheme="webcal" />
            <data android:pathPattern=".*.ics" />
        </intent-filter>
    </activity>
    <activity android:name="OptionsActivity"></activity>
    <activity android:name="DetailActivity"></activity>
    <activity android:name="AboutActivity"></activity>

</application>
</manifest>

不行,没有任何区别。即使使用了*.ics路径模式和您提供的规则,浏览器仍然继续显示数据而不是将URL交给我的应用程序。 - Andreas Gohr
1
我相信您要寻找的表达式是:".* .ics",更多信息请参考文档:http://developer.android.com/guide/topics/manifest/data-element.html - TheIT
@TheIT 发现得真好!这是一个古老的帖子,但我希望有人会觉得它有用。我会更新答案。难道不应该是 .*\.ics 来转义第二个句点吗? - Moog

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接