URL重定向无法通过Intent在Android中工作-(未找到页面错误)

URL重定向无法通过Intent在Android中工作-(未找到页面错误),android,mobile-browser,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("h

我有以下代码:

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);
    }
});
从技术上讲,此代码可以将用户发送到该url,但由于某些原因,此特定url会转到在此代码中找不到的页面,但如果将此url放入浏览器,则会呈现该页面。但当从应用程序中完成时,它会转到“未找到”页面。我正在用Android Safari浏览器进行测试

是因为URL上的重定向吗?我怎样才能解决这个问题

我的清单文件中确实有这一行:

<uses-permission android:name="android.permission.INTERNET" />

注:

互联网连接不是问题。此代码适用于其他URL。这是一个奇怪的事情,发生在这个特定的链接


谢谢

下面我的答案中的代码和相应的重定向对我有效

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

根据官方的安卓系统,它也应该在之前低于19的api级别上工作。我假设Chrome文档提到了最低api级别19,因为它专门针对希望使用HTML5功能的web开发人员

也就是说,这个解决方案在我以前的Sprint XPRT(Android 2.3.5-API级别10)上不起作用,在模拟Nexus S(上面有KitKat的旧图像)上也不起作用。在这两个页面上都显示“未找到网页”。当我使用浏览器在我的XPRT上进一步尝试它,但手动输入url时,我得到的对话框是“无法建立安全连接”。不幸的是,删除https中的“s”也不起作用,因为它会重定向到安全版本,而我仍然得到“无法建立安全连接”

前面的答案:

如果你完全按照Chrome的网络视图。你将进入这一部分。粗体的强调是我的

处理导航

现在尝试更改加载到的URL 然后重新运行应用程序。你会注意到的 奇怪的事

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

以下是事件的顺序:

  • WebView尝试从远程服务器加载原始URL,然后 获取指向新URL的重定向

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

  • 系统将选择 用于处理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();
            }
        }     
    }
    
    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>
    
    
    工具:ignore=“MergeRootFrame”>
    

    另外,对于阅读本文的其他人,我没有在清单中提及所需的互联网许可,因为最初提出请求的人已经涵盖了该部分

    如果您在Android Safari浏览器中发现页面未找到错误,则可以在chrome浏览器中打开许多设备具有的链接,或者让用户选择浏览器应用程序,该应用程序将在选定的浏览器中打开链接

    要打开google chrome浏览器中的链接,您必须检查设备中是否安装了该链接。为此,您可以使用此方法检查是否安装了chrome浏览器

    private boolean isPackageInstalled(String packagename, Context context) {
         PackageManager pm = context.getPackageManager();
         try {
             pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
             return true;
         } catch (PackageManager.NameNotFoundException e) {
             return false;
         }
    } 
    
    chrome浏览器的包名是
    com.android.chrome
    。您必须使用
    browserint.setPackage(“com.android.chrome”)将其设置为包名

    要向用户显示选择应用程序的选项,您可以这样创建:

    Intent chooserIntent = Intent.createChooser(browserIntent, "Select Application");
    startActivity(chooserIntent);
    
    这是您的最终代码:

    Intent browserIntent = new Intent(Intent.ACTION_VIEW,
                      Uri.parse("https://www.bluehost.com/track/businessplan/"));
    boolean isChromeInstalled = isPackageInstalled("com.android.chrome", YourActivityName.this);
    if (isChromeInstalled) {
        browserIntent.setPackage("com.android.chrome");
        startActivity(browserIntent);
    }else{
        Intent chooserIntent = Intent.createChooser(browserIntent, "Select Application");
        startActivity(chooserIntent);
    }
    
    但请注意,如果您提供了选择浏览器应用程序的选项,那么Safari浏览器也会列出

    或者您也可以选择使用
    Webview
    ,答案如下


    我希望这对您有所帮助。

    浏览器中存在某些可用的bug

    对SPDY和HTTP/2的支持仅限于某些现代版本的 Google Chrome、Opera、Firefox、Safari和Internet Explorer浏览器。 有关更多详细信息,请参阅 哪些浏览器支持SPDY和at 哪些浏览器支持HTTP/2

    所有浏览器仅支持通过TLS连接的SPDY和HTTP/2。 因此,必须使用HTTPS来利用SPDY或HTTP/2

    当我在chrome浏览器中尝试链接时,它会显示“网页不可用”。但当我在opera浏览器中尝试同样的操作时,它会打开

    在Chrome浏览器上显示“ERR_SPDY_PROTOCOL_ERROR”。当我冲浪的时候 在互联网上,它说,这是存在于Chrome浏览器中的漏洞 本身可能的解决方案之一是尝试解决方法 本参考文件中提到的

  • 尝试将手机中可用的浏览器更新为最新版本

  • 实际站点可能因维护而停机

  • 如果您在手机中安装了“Avast应用”,请尝试添加链接

  • 可以通过URI检查Chrome中的SPDY会话:chrome://net-internals/#events&q=type:SPDY_SESSION%20is:active. 您可能会在那里找到类似的内容:

    SPDY已启用:true

    使用备用协议:true

    强迫SPDY始终:错误

    通过SSL强制SPDY:true

    下一个协议:http/1.1、spdy/2、spdy/3

  • 如果您只是将“SPDY Enabled”选项设置为false,那么问题将得到解决,因为在这之后,HTTP将用于web通信<
    Use this