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


1343

如何通过内置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

6
我认为这是因为这个:android-developers.blogspot.com/2009/12/...
Arutha

1
为什么这在某些设备中不起作用?即使有Web浏览器,也会转到ActivityNotFoundException。

我看到了与@Manu相同的问题。在Nexus 6上进行的基本安装为Chrome,但链接导致异常。
Brill Pappin

Answers:


2453

尝试这个:

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;

我还可能会预先填充您的EditText,即用户正在使用“ http://”输入URL。


2
除了您的代码和mbaird的代码不同之外,据我所知,已发布的内容。确保您的网址具有http://方案-显示的异常表明您的网址缺少方案。
CommonsWare 2010年

5
是的!它错过了http://!URL是由用户输入的,是否可以自动格式化?
阿鲁莎2010年

4
URLUtil是检查用户输入的“ url”字符串的好方法
Dan

90
if (!url.startsWith("http://") && !url.startsWith("https://"))是一个常见错误,可能会导致您进入file://之类的网址,并破坏了一些很好的用例。尝试使用URI类解析uri并检查是否存在架构。如果否,则添加“ http://”;)
tuxSlayer

22
您需要使用进行空检查resolveCheck。请参阅官方文档警告:如果设备上没有可以接收隐式意图的应用程序,则您的应用程序在调用startActivity()时将崩溃。要首先验证是否存在某个应用程序可以接收该意图,请在您的Intent对象上调用resolveActivity()。
kenju 2015年

90

下一个代码是实现此目的的常用方法:

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")));

祝您编码愉快!


57

简单答案

您可以从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,该Activity与具有指定URL的Intent捆绑在一起。

我需要if支票对帐单吗?

是。该文件说:

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

奖金

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

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

3
假定提供的URL中包含http
IgorGanapolsky '17

56

在2.3中,我的运气更好

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

区别在于使用Intent.ACTION_VIEW而不是字符串"android.intent.action.VIEW"


1
有什么不同?
user1324936

1
这个答案极大地帮助了我。我不知道有什么区别,但是我们解决了2.3的问题。有谁知道实现的区别是什么?
Innova 2013年

2
根据Android Developer:这个答案-“使用给定的动作创建一个意图。所有其他字段(数据,类型,类)均为空。” 以及可接受的答案-“使用给定的操作和给定的数据URL创建意图。”
Teo Inke

30

尝试这个:

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

或者,如果您要在活动中打开Web浏览器,则可以这样:

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

如果您想在浏览器中使用缩放控制,则可以使用:

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

4
请注意,插件等在WebView中被禁用,并且需要INTERNET权限。(参考

22

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

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 :)

}

5
如果有多个应用程序可以处理此意图,则系统会自动提供选择器,对吗?
Jeffrey Blattman

@ xmen-wk,因为url可以以http或开头以太https,在Java中,将“魔术字符串”声明为常量是一种好习惯。
Dmytro Danylyk

thx,不知道context.startActivity。从外部类调用它时非常有用
WuerfelDev

18

就像其他解决方案所写的(可以正常工作)一样,我也想回答同样的事情,但是我建议大多数人都倾向于使用该技巧。

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

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.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);

还有一种方法可以在“ Chrome自定义标签”中打开URL 。Kotlin中的示例:

@JvmStatic
fun openWebsite(activity: Activity, websiteUrl: String, useWebBrowserAppAsFallbackIfPossible: Boolean) {
    var websiteUrl = websiteUrl
    if (TextUtils.isEmpty(websiteUrl))
        return
    if (websiteUrl.startsWith("www"))
        websiteUrl = "http://$websiteUrl"
    else if (!websiteUrl.startsWith("http"))
        websiteUrl = "http://www.$websiteUrl"
    val finalWebsiteUrl = websiteUrl
    //https://github.com/GoogleChrome/custom-tabs-client
    val webviewFallback = object : CustomTabActivityHelper.CustomTabFallback {
        override fun openUri(activity: Activity, uri: Uri?) {
            var intent: Intent
            if (useWebBrowserAppAsFallbackIfPossible) {
                intent = Intent(Intent.ACTION_VIEW, Uri.parse(finalWebsiteUrl))
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY
                        or Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
                if (!CollectionUtil.isEmpty(activity.packageManager.queryIntentActivities(intent, 0))) {
                    activity.startActivity(intent)
                    return
                }
            }
            // open our own Activity to show the URL
            intent = Intent(activity, WebViewActivity::class.java)
            WebViewActivity.prepareIntent(intent, finalWebsiteUrl)
            activity.startActivity(intent)
        }
    }
    val uri = Uri.parse(finalWebsiteUrl)
    val intentBuilder = CustomTabsIntent.Builder()
    val customTabsIntent = intentBuilder.build()
    customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY
            or Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
    CustomTabActivityHelper.openCustomTab(activity, customTabsIntent, uri, webviewFallback)
}

万一网络浏览器出现问题,执行新任务是否可以保护源应用程序免受错误和崩溃的影响?
原始Android

@TheOriginalAndroid我不知道它与崩溃和Web浏览器有什么关系。请说明您要做什么。
Android开发人员

感谢您的答复。您的帖子很有趣。打开新任务(特别是对于Web启动)有什么好处?
原始Android

2
@TheOriginalAndroid只是为了使用户能够切换回您的应用程序,然后再切换回Web浏览器。如果打开“最近任务”屏幕,您将在此处看到2个任务,而不是一个。此外,您不会看到在单个任务(属于应用程序任务)中的Web浏览器缩略图,而是看到2:一个应用程序,另一个Web浏览器。我认为这种方式不太令人困惑。
Android开发人员

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET已弃用
Pratik Butani

17

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

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

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

12

你也可以这样

在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");

 }

}

在清单中,不要忘记添加互联网许可...


这很有趣而且与众不同。我想用户可以通过这种方式在我的应用中看到网络浏览器。那正确吗?我支持。
原始Android

9

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

简短的代码版本...

 if (!strUrl.startsWith("http://") && !strUrl.startsWith("https://")){
     strUrl= "http://" + strUrl;
 }


 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(strUrl)));

6

在您的try块中,粘贴以下代码,Android Intent直接使用URI(统一资源标识符)大括号内的链接来标识链接的位置。

您可以尝试以下方法:

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

5

简单和最佳实践

方法1:

String intentUrl="www.google.com";
Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(intentUrl));
    if(webIntent.resolveActivity(getPackageManager())!=null){
        startActivity(webIntent);    
    }else{
      /*show Error Toast 
              or 
        Open play store to download browser*/
            }

方法2:

try{
    String intentUrl="www.google.com";
    Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(intentUrl));
        startActivity(webIntent);
    }catch (ActivityNotFoundException e){
                /*show Error Toast
                        or
                  Open play store to download browser*/
    }

使用context!!.packageManager,而不是getPackageManager()一个Fragment
CoolMind

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

3
Intent getWebPage = new Intent(Intent.ACTION_VIEW, Uri.parse(MyLink));          
startActivity(getWebPage);

欢迎,新手。请使答案更完整,声明原始代码中不存在的变量。
Tony gil 2014年


3

Chrome自定义标签现在可用:

第一步是将“定制选项卡支持库”添加到build.gradle文件中:

dependencies {
    ...
    compile 'com.android.support:customtabs:24.2.0'
}

然后,打开chrome自定义标签:

String url = "https://www.google.pt/";
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));

有关更多信息:https : //developer.chrome.com/multidevice/android/customtabs


2

根据Mark B的回答和下面的评论:

protected void launchUrl(String url) {
    Uri uri = Uri.parse(url);

    if (uri.getScheme() == null || uri.getScheme().isEmpty()) {
        uri = Uri.parse("http://" + url);
    }

    Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);

    if (browserIntent.resolveActivity(getPackageManager()) != null) {
        startActivity(browserIntent);
    }
}

2

android.webkit.URLUtil自(Android 1.0)起,该方法就可以guessUrl(String)完美运行(即使使用file://或也可以)。用于:data://Api level 1

String url = URLUtil.guessUrl(link);

// url.com            ->  http://url.com/     (adds http://)
// http://url         ->  http://url.com/     (adds .com)
// https://url        ->  https://url.com/    (adds .com)
// url                ->  http://www.url.com/ (adds http://www. and .com)
// http://www.url.com ->  http://www.url.com/ 
// https://url.com    ->  https://url.com/
// file://dir/to/file ->  file://dir/to/file
// data://dataline    ->  data://dataline
// content://test     ->  content://test

在活动调用中:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(URLUtil.guessUrl(download_link)));

if (intent.resolveActivity(getPackageManager()) != null)
    startActivity(intent);

检查完整的guessUrl代码以获取更多信息。


2

好的,我检查了每个答案,但是哪个应用程序具有与用户要使用的相同URL的深层链接?

今天我有这种情况,答案是 browserIntent.setPackage("browser_package_name");

例如:

   Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
    browserIntent.setPackage("com.android.chrome"); // Whatever browser you are using
    startActivity(browserIntent);

谢谢!


好答案。它说明了如何(直接)在特定的浏览器上打开Intent URL,而不依赖于系统选择浏览器。
Mr-IDE

2

通过意图进行简单的网站查看,

Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse("http://www.yoursite.in"));
startActivity(viewIntent);  

使用此简单的代码在android应用中查看您的网站。

在清单文件中添加互联网许可,

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

2
String url = "https://www.thandroid-mania.com/";
if (url.startsWith("https://") || url.startsWith("http://")) {
    Uri uri = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
}else{
    Toast.makeText(mContext, "Invalid Url", Toast.LENGTH_SHORT).show();
}

发生该错误是由于网址无效,Android操作系统找不到您的数据的操作视图。因此,您必须验证该URL是否有效。


1

我认为这是最好的

openBrowser(context, "http://www.google.com")

将以下代码放入全局类

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

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

        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        context.startActivity(browserIntent);
    }

1

这种方法使用一种方法,允许您输入任何String而不是使用固定的输入。如果重复使用多次,这确实会节省一些代码行,因为您只需要三行即可调用该方法。

public Intent getWebIntent(String url) {
    //Make sure it is a valid URL before parsing the URL.
    if(!url.contains("http://") && !url.contains("https://")){
        //If it isn't, just add the HTTP protocol at the start of the URL.
        url = "http://" + url;
    }
    //create the intent
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)/*And parse the valid URL. It doesn't need to be changed at this point, it we don't create an instance for it*/);
    if (intent.resolveActivity(getPackageManager()) != null) {
        //Make sure there is an app to handle this intent
        return intent;
    }
    //If there is no app, return null.
    return null;
}

使用此方法使其通用。您不必将IT置于特定的活动中,因为您可以这样使用它:

Intent i = getWebIntent("google.com");
if(i != null)
    startActivity();

或者,如果您想在活动之外启动它,只需在活动实例上调用startActivity即可:

Intent i = getWebIntent("google.com");
if(i != null)
    activityInstance.startActivity(i);

从这两个代码块中都可以看到空检查。这是因为如果没有应用程序可以处理该意图,则返回null。

如果未定义协议,则此方法默认为HTTP,因为有些网站没有SSL证书(HTTPS连接需要什么),并且如果您尝试使用HTTPS并且不存在,则这些网站将停止工作。任何网站都仍然可以强制使用HTTPS,因此无论哪种方式,您都可以使用HTTPS


因为此方法使用外部资源来显示页面,所以您无需声明INternet权限。显示网页的应用必须执行此操作


1

// OnClick监听器

  @Override
      public void onClick(View v) {
        String webUrl = news.getNewsURL();
        if(webUrl!="")
        Utils.intentWebURL(mContext, webUrl);
      }

//您的Util方法

public static void intentWebURL(Context context, String url) {
        if (!url.startsWith("http://") && !url.startsWith("https://")) {
            url = "http://" + url;
        }
        boolean flag = isURL(url);
        if (flag) {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse(url));
            context.startActivity(browserIntent);
        }

    }

在哪里定义“ isURL”?
Cabuxa.Mapache '18

1

只需简短输入一个即可在浏览器中打开您的网址:

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("YourUrlHere"));
startActivity(browserIntent);

1

Kotlin的答案:

val browserIntent = Intent(Intent.ACTION_VIEW, uri)
ContextCompat.startActivity(context, browserIntent, null)

我添加了扩展程序,Uri以使其更容易

fun Uri?.openInBrowser(context: Context) {
    this ?: return // Do nothing if uri is null

    val browserIntent = Intent(Intent.ACTION_VIEW, this)
    ContextCompat.startActivity(context, browserIntent, null)
}

另外,这是一个简单的扩展函数,可将String安全地转换为Uri。

fun String?.asUri(): Uri? {
    try {
        return Uri.parse(this)
    } catch (e: Exception) {}
    return null
}

1

因此,我已经寻找了很长时间,因为所有其他答案都为该链接打开了默认应用,但没有默认浏览器,这就是我想要的。

我终于设法做到了:

// gathering the default browser
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"));
final ResolveInfo resolveInfo = context.getPackageManager()
    .resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
String defaultBrowserPackageName = resolveInfo.activityInfo.packageName;


final Intent intent2 = new Intent(Intent.ACTION_VIEW);
intent2.setData(Uri.parse(url));

if (!defaultBrowserPackageName.equals("android") {
    // android = no default browser is set 
    // (android < 6 or fresh browser install or simply no default set)
    // if it's the case (not in this block), it will just use normal way.
    intent2.setPackage(defaultBrowserPackageName);
}

context.startActivity(intent2);

顺便说一句,context无论如何,您都可以注意到。因为我已将其用于静态util方法,所以如果您在活动中执行此操作,则不需要它。



0

试试这个。为我工作!

    public void webLaunch(View view) {
            WebView myWebView = (WebView) findViewById(R.id.webview);
            myWebView.setVisibility(View.VISIBLE);
            View view1=findViewById(R.id.recharge);
            view1.setVisibility(View.GONE);
            myWebView.getSettings().setJavaScriptEnabled(true);
            myWebView.loadUrl("<your link>");

        }

xml代码:-

 <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webview"
        android:visibility="gone"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />

- - - - - 要么 - - - - - - - - -

String url = "";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

对于大多数应用程序而言,添加WebView是一种很难的方法。在浏览器中打开URL更容易。
Zoe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.