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

时间:2016-01-02 02:48:59

标签: 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);
    }
});

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

是否因为网址重定向?我怎么能解决这个问题?

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

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

注意:

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

谢谢!

5 个答案:

答案 0 :(得分:5)

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

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

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

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

早期答案:

如果您完全按照Chrome浏览器WebView tutorial进行操作。你会得到这个部分。 粗体的重点是我的。

  

处理导航

     

现在尝试更改您要加载的网址   http://www.html5rocks.com/并重新运行您的申请。你会注意到的   奇怪的事。

     

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

     

以下是事件的顺序:

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

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

  4.   
  5. 系统选择   用户处理http:// URL方案的首选应用程序 -   也就是说,用户的默认浏览器。如果您有多个浏览器   安装完毕后,您可能会看到一个对话框。

  6.   

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

以下是该教程的link停止工作时的实际代码:

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>

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

答案 1 :(得分:2)

如果您在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。您必须使用browserIntent.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浏览器。

或者您也可以选择使用Stephan Branczyk

回答的Webview

我希望这会对你有所帮助。

答案 2 :(得分:0)

浏览器存在某些错误。

  

对SPDY和HTTP / 2的支持仅限于某些现代版本   谷歌浏览器,Opera,Firefox,Safari和Internet Explorer浏览器。   有关更多详细信息,请查看http://caniuse.com/spdy   什么浏览器支持SPDY和http://caniuse.com/http2   什么浏览器支持HTTP / 2。

     

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

当我在Chrome浏览器中尝试链接时,它说“网页不可用”。但是当我在Opera浏览器中尝试相同时,它会打开。

  

在Chrome浏览器上显示“ERR_SPDY_PROTOCOL_ERROR”。我冲浪的时候   它说,这是Chrome浏览器中存在的错误   本身。 可能的解决方案之一是尝试解决方法   在此参考中提到 link

  1. 尝试将您手机中的浏览器更新为最新版本。

  2. 实际网站可能已关闭进行维护。

  3. 如果您在手机中安装了“Avast App”,请尝试添加链接

  4. 可以通过URI检查Chrome中的SPDY会话:chrome:// net-internals /#events&amp; q = type:SPDY_SESSION%20is:active。 你可能会在那里找到类似的东西:

    SPDY已启用:true

    使用替代协议:true

    强制SPDY始终:false

    强制SPDY Over SSL:true

    下一步议定书:http / 1.1,spdy / 2,spdy / 3

  5. 如果您只是将“SPDY Enabled”选项设置为false,则问题将在此之后解决,HTTP将用于Web通信。

    1. 如果您在移动设备上安装了avast应用程序,avast也可能会导致问题。转到设置&gt;主动保护&gt;自定义Web Shield&gt;排除&gt;在此处添加“您的链接”。
    2. 希望它可以帮助你......在某些情况下!!抱歉我的英语不好。

      从互联网收集的来源。

答案 3 :(得分:0)

如果重定向不起作用,您的代码将在设备浏览器中打开网址,问题肯定不在您的代码上。它可能是因为网站中的重定向无法正常工作,或者您使用的浏览器无法执行此重定向。在你的情况下,我猜你正在使用的浏览器无法执行重定向。

答案 4 :(得分:-1)

Use this 

Uri uri = Uri.parse(“https://www.bluehost.com/track/businessplan/”);     startActivity(Intent.createChooser(new Intent(Intent.ACTION_VIEW,uri),“选择浏览器”));