题 如何从我的应用程序在Android的Web浏览器中打开URL?


如何从内置Web浏览器中的代码而不是在我的应用程序中打开URL?

我试过这个:

try {
    Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(download_link));
    startActivity(myIntent);
} catch (ActivityNotFoundException e) {
    Toast.makeText(this, "No application can handle this request."
        + " Please install a webbrowser",  Toast.LENGTH_LONG).show();
    e.printStackTrace();
}

但我有一个例外:

No activity found to handle Intent{action=android.intent.action.VIEW data =www.google.com

1073
2018-02-04 17:51


起源


我想是因为这个: android-developers.blogspot.com/2009/12/... - Arutha
为什么这在某些设备上不起作用?即使有Web浏览器,也会转到ActivityNotFoundException。
我和@Manu看到了同样的问题。 Nexus 6上的基本安装有chrome,但链接导致异常。 - Brill Pappin


答案:


尝试这个:

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
startActivity(browserIntent);

这对我来说很好。

至于缺少的“http://”我会做这样的事情:

if (!url.startsWith("http://") && !url.startsWith("https://"))
   url = "http://" + url;

我也可能预先填充用户使用“http://”键入URL的EditText。


2037
2018-02-04 18:01



除了你的代码和mbaird是不一样的,从我可以告诉你发布的内容。确保您的网址具有 http:// scheme - 显示的例外表明您的URL缺少该方案。 - CommonsWare
是的!它错过了http://! URL是由用户输入的,有没有办法自动格式化? - Arutha
URLUtil是检查用户输入的“url”字符串的好方法 - Dan
if (!url.startsWith("http://") && !url.startsWith("https://")) 是一个常见的错误,可能会导致你喜欢的网址 文件:// 并打破一些好的用例。尝试用URI类解析uri并检查是否有架构。如果不是,请添加“http://”;) - tuxSlayer
你需要空检查 resolveCheck。见 官方文档 : 警告:如果设备上没有可以接收隐式意图的应用程序,则当应用程序调用startActivity()时,您的应用程序将崩溃。要首先验证应用程序是否存在以接收意图,请在Intent对象上调用resolveActivity()。 - phi


实现这一目标的常用方法是使用下一个代码:

String url = "http://www.stackoverflow.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url)); 
startActivity(i); 

可以改成短代码版本......

Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://www.stackoverflow.com"));      
startActivity(intent); 

要么 :

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.stackoverflow.com")); 
startActivity(intent);

最短的! :

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.stackoverflow.com")));

快乐的编码!


60
2018-05-27 14:20





在2.3中,我运气好了

final Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url));
activity.startActivity(intent);

不同的是使用 Intent.ACTION_VIEW 而不是String "android.intent.action.VIEW"


47
2018-03-16 15:35



哇是不同的? - user1324936
这个答案对我帮助很大。我不知道有什么不同,但我们遇到了2.3问题,这解决了。有谁知道实施中的差异是什么? - Innova
根据Android Developer的说法:这个答案 - “用给定的动作创建一个意图。所有其他字段(数据,类型,类)都是空的。”和接受的答案 - “使用给定的操作和给定的数据URL创建意图。” - Teo Inke


简单的答案

你可以看到 来自Android Developer的官方样本

/**
 * Open a web page of a specified URL
 *
 * @param url URL to open
 */
public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

怎么运行的

请看一下构造函数 Intent

public Intent (String action, Uri uri)

你可以通过 android.net.Uri 实例到第二个参数,并根据给定的数据URL创建新的Intent。

然后,简单地打电话 startActivity(Intent intent) 启动一个新的Activity,它与给定URL的Intent捆绑在一起。

我需要吗? if 检查声明?

是。该 文档 说:

如果设备上没有可以接收隐式意图的应用,则应用会在调用startActivity()时崩溃。要首先验证应用程序是否存在以接收意图,请在Intent对象上调用resolveActivity()。如果结果为非null,则至少有一个应用程序可以处理意图,并且可以安全地调用startActivity()。如果结果为null,则不应使用intent,如果可能,应禁用调用intent的功能。

奖金

您可以在创建Intent实例时在一行中编写,如下所示:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

36
2017-08-24 05:06



这假定提供的网址有 HTTP 在里面。 - Igor Ganapolsky


尝试这个:

Uri uri = Uri.parse("https://www.google.com");
startActivity(new Intent(Intent.ACTION_VIEW, uri));

或者如果你想在你的活动中打开网页浏览器,那么这样做:

WebView webView = (WebView) findViewById(R.id.webView1);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
webView.loadUrl(URL);

如果您想在浏览器中使用缩放控件,那么您可以使用:

settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);

24
2017-08-31 10:10



请注意,在WebView中禁用了插件等,并且需要INTERNET权限。 (参考) - Keelan


如果你想向用户显示所有浏览器列表的对话,那么他可以选择首选,这里是示例代码:

private static final String HTTPS = "https://";
private static final String HTTP = "http://";

public static void openBrowser(final Context context, String url) {

     if (!url.startsWith(HTTP) && !url.startsWith(HTTPS)) {
            url = HTTP + url;
     }

     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
     context.startActivity(Intent.createChooser(intent, "Choose browser"));// Choose browser is arbitrary :)

}

20
2018-01-09 08:55



如果有多个应用可以处理意图,系统会自动提供一个选择器,对吧? - Jeffrey Blattman
什么是制作HTTP和HTTPS字段的重点? - xmen
@ xmen-w-k因为url可以启动以太网 http 要么 https在java中,将“魔术字符串”声明为常量是一种很好的做法。 - Dmytro Danylyk
@JeffreyBlattman是(2年后^^) - Erdal G.
thx,不知道 context.startActivity。从外部类调用它时非常有用 - WuerfelDev


就像其他人编写的解决方案(工作正常)一样,我想回答相同的问题,但我认为大多数人更愿意使用。

如果您希望应用程序开始在新任务中打开,而不是您自己的任务,而不是停留在同一堆栈上,您可以使用以下代码:

final Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);

15
2018-04-08 09:19



如果Web浏览器出现问题,是否会创建一个新任务来保护源应用程序免受错误和崩溃? - The Original Android
@TheOriginalAndroid我不明白它与崩溃和网络浏览器有什么关系。请解释一下你要做什么。 - android developer
感谢您的答复。你的帖子很有趣。打开新任务尤其是网络发布的好处是什么? - The Original Android
@TheOriginalAndroid只是为了让用户能够切换回你的应用程序,然后再回到网络浏览器。如果您打开最近任务屏幕,则会在此处看到2个任务而不是一个。此外,您不会在单个任务(属于您的应用程序的任务)中看到Web浏览器缩略图,而是会看到2:您的应用程序之一,以及另一个Web浏览器。我认为这种方式不那么令人困惑。 - android developer


其他选项使用Webview在相同应用程序中加载URL

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");

14
2018-06-25 08:01



请注意,在WebView中禁用了插件等,并且需要INTERNET权限。 (参考) - Keelan


你也可以这样走

在xml中:

<?xml version="1.0" encoding="utf-8"?>
<WebView  
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

在java代码中:

public class WebViewActivity extends Activity {

private WebView webView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webview);

    webView = (WebView) findViewById(R.id.webView1);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl("http://www.google.com");

 }

}

在Manifest中别忘了添加互联网权限......


10
2017-12-19 06:04



这很有意思,也有所不同。我猜这种方式用户在我的应用程序中看到了一个Web浏览器。是对的吗?我赞成。 - The Original Android


Webview可用于在您的应用程序中加载Url。 可以在文本视图中从用户提供URL,也可以对其进行硬编码。

另外不要忘记AndroidManifest中的互联网权限。

String url="http://developer.android.com/index.html"

WebView wv=(WebView)findViewById(R.id.webView);
wv.setWebViewClient(new MyBrowser());
wv.getSettings().setLoadsImagesAutomatically(true);
wv.getSettings().setJavaScriptEnabled(true);
wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
wv.loadUrl(url);

private class MyBrowser extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}

6
2017-11-12 21:41



这修复了我的视频问题: github.com/CrandellWS/VideoEnabledWebView/blob/master/app/src/... - CrandellWS