为什么我的活动不是由URL启动的?

时间:2011-03-04 20:19:27

标签: android android-activity android-emulator intentfilter

我意识到有几个类似的问题,但没有一个接受的答案对我有用。作为oauth流程的一部分,我想要一个浏览器重定向来启动我的活动。正如我到处看到的那样,我已经建立了一个意图过滤器,据说可以做到:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.codesta.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".BrowsableActivity"
                  android:label="@string/app_name">
            <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="oauth.android.mydomain.com" />
            </intent-filter>
        </activity>

    </application>
</manifest>

但是,当我打开浏览器并输入http://oauth.android.mydomain.com时,我收到“网页不可用”错误页面。我也试过定义我自己的方案(我读过的通常不推荐),但这也不起作用。

我的目标是api level 7,并且在运行2.1和2.2的模拟设备上测试了代码但没有成功。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题 - 据我所知,有几个OAuth网站使用&lt; META ... /&gt;标记以执行您尝试捕获的最终重定向。

使用META标记的重定向不会被Intent过滤器捕获,因此您的代码永远不会执行。奇怪的是,如果用户单击相同的链接,或者使用Location:标头重定向,则会触发。已经有一个开放的Android 2.2.1错误票,但我已经失去了对它的引用。

通常的解决方法是在回调网址上设置一个真实页面,然后使用Location:标头将其重定向到您可以捕获的其他位置。

编辑:我尝试使用Location:标头,看起来一般重定向到http://没有被捕获,但重定向到另一个方案(x-oauth://)是不受欢迎的,但是的工作原理。

答案 1 :(得分:0)

我不确定,我可以稍后测试,但我想当你在浏览器中输入它时,你会告诉浏览器打开它。

可能需要的是实际点击加载该方案的链接://主机组合,不仅要将其输入“url bar”。

编辑:对不起,我做了一个快速测试,但事实并非如此。尽管如此,问题可能是浏览器在实际到达intent部分之前尝试解析主机并提供​​您使用应用程序打开它。它是否适用于真实的网址(假设我猜测这不是一个真正的解析网址?)

答案 2 :(得分:0)

只要我使用真实域,intent-filter对http和https方案工作正常。但是,弹出窗口询问用户是否要使用浏览器而不是应用程序是不可接受的。我尝试使用自己的方案,但这不起作用(不明白为什么)。

出于我的应用程序的目的,使用WebView创建活动就足够了,而不是使用完全迁移的浏览器,我覆盖了WebViewClient的shouldOverrideUrlLoading并为我的uri捕获请求并将它们直接发送到我的活动。这个解决方案实际上比我之前尝试做的更好,因为用户没有得到提示,我不必定义全局方案。

答案 3 :(得分:0)

...奔

检查将Scheme更改为https而不是http。