URL重定向无法通过Intent在Android中运行 - (找不到页面错误)

Gen*_*nik 16 android mobile-browser

我有这个代码:

Button bluehost = (Button)findViewById(R.id.bluehost);
bluehost.setOnClickListener(new Button.OnClickListener()
{
    public void onClick(View v)
    {
        Intent browserIntent = new Intent(Intent.ACTION_VIEW,
                Uri.parse("https://www.bluehost.com/track/businessplan/"));
        startActivity(browserIntent);
    }
});
Run Code Online (Sandbox Code Playgroud)

从技术上讲,此代码可以将此人发送到该URL,但由于某种原因,此特定URL会转到此代码中找不到的页面,但是如果您将此URL放入浏览器中则会呈现.但是当从应用程序完成时,它转到页面未找到.我正在使用Android Safari浏览器进行测试.

是因为URL的重定向吗?我怎么能解决这个问题呢?

我在清单文件中有这一行:

<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)

注意:

互联网连接不是问题.此代码适用于其他URL.这个具体的链接正在发生一些奇怪的事情.

谢谢!

Ste*_*zyk 5

我在下面的回答中的代码和相应的重定向对我有用.

在我的Xperia Z Ultra上,它看起来像这样:

根据官方Android 文档,它也应该适用于19以下的api级别.我假设Chrome文档提到了最低api级别19,因为它专门针对想要使用其HTML5功能的Web开发人员.

话虽这么说,这个解决方案不适用于我的旧版Sprint XPRT(Android 2.3.5 - API Level 10),并且它不适用于模拟的Nexus S(其上有一个旧的KitKat图像).它说"两个网页都找不到".当我使用浏览器在我的XPRT上进一步尝试它,但是手动输入了URL时,我得到了"无法建立安全连接"的对话框.不幸的是,删除https中的's'也不起作用,因为它重定向到安全版本,我仍然得到"无法建立安全连接".

早期答案:

如果您完全按照Chrome WebView 教程进行操作.你会得到这个部分.大胆的重点是我的.

处理导航

现在尝试将您正在加载的URL更改为 http://www.html5rocks.com/并重新运行您的应用程序.你会注意到一些奇怪的东西.

如果您现在使用具有html5rocks.com重定向的站点运行应用程序,您的应用程序最终会在设备上的浏览器中打开该站点,而不是在WebView中 - 可能不是您所期望的.这是因为WebView处理导航事件的方式.

这是事件的顺序:

  1. WebView尝试从远程服务器加载原始URL,并获取重定向到新URL.

  2. WebView检查系统是否可以处理URL的视图意图,如果是,系统将处理URL导航,否则WebView将在内部导航(即用户未在其设备上安装浏览器).

  3. 系统选择用户首选的应用程序来处理http:// URL方案 - 即用户的默认浏览器.如果您安装了多个浏览器,此时可能会看到一个对话框.

换句话说,如果您此时停止教程,您将获得所需的行为.

以下是实际代码,以防该教程的链接停止工作:

MainActivity.java

public class MainActivity extends Activity {

 private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       mWebView = (WebView) findViewById(R.id.activity_main_webview);
       mWebView.loadUrl("https://www.bluehost.com/track/businessplan/");
    }

    @Override
    public void onBackPressed() {
        if(mWebView.canGoBack()) {
            mWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }     
}
Run Code Online (Sandbox Code Playgroud)

activity_main.xml中

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/container"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">
     tools:ignore="MergeRootFrame">

         <WebView
         android:id="@+id/activity_main_webview"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

此外,对于其他读这篇文章的人,我没有在清单中提及所需的INTERNET许可,因为原来的人已经要求覆盖该部分.