我有这段代码:
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。这个具体的链接发生了一些奇怪的事情。
谢谢!
答案 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处理导航事件的方式。
以下是事件的顺序:
WebView尝试从远程服务器加载原始URL,并且 获取重定向到新URL。
WebView检查系统是否可以 处理URL的视图意图,如果是,则系统处理URL 导航,否则WebView将在内部导航(即 用户的设备上没有安装浏览器)。
- 醇>
系统选择 用户处理http:// URL方案的首选应用程序 - 也就是说,用户的默认浏览器。如果您有多个浏览器 安装完毕后,您可能会看到一个对话框。
换句话说,如果您此时停止教程,您将获得所需的行为。
以下是该教程的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
尝试将您手机中的浏览器更新为最新版本。
实际网站可能已关闭进行维护。
如果您在手机中安装了“Avast App”,请尝试添加链接
可以通过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
如果您只是将“SPDY Enabled”选项设置为false,则问题将在此之后解决,HTTP将用于Web通信。
希望它可以帮助你......在某些情况下!!抱歉我的英语不好。
从互联网收集的来源。
答案 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),“选择浏览器”));