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

How can I open a URL in Android's web browser from my application?

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

我试过这个:

1
2
3
4
5
6
7
8
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();
}

但我有个例外:

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


试试这个:

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

那对我来说很好。

对于缺少的"http://"我只会这样做:

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

我也可能会预先填充您的editText,用户在其中键入一个带有"http://"的URL。


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

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

可以改成短代码版本…

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

或:

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

最短的!:

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

快乐编码!


在2.3节,我更幸运的是

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

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


简单答案

你可以看到Android开发者的官方样本。

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 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的构造:

1
public Intent (String action, Uri uri)

您可以将android.net.Uri实例传递给第二个参数,并根据给定的数据URL创建新的意图。

然后,只需调用startActivity(Intent intent)启动一个新的活动,这个活动与给定的URL的意图捆绑在一起。

我需要if支票对账单吗?

对。博士说:

If there are no apps on the device that can receive the implicit intent, your app will crash when it calls startActivity(). To first verify that an app exists to receive the intent, call resolveActivity() on your Intent object. If the result is non-null, there is at least one app that can handle the intent and it's safe to call startActivity(). If the result is null, you should not use the intent and, if possible, you should disable the feature that invokes the intent.

奖金

创建意向实例时,您可以在一行中写入,如下所示:

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


试试这个:

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

或者,如果希望在活动中打开Web浏览器,请执行以下操作:

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

如果要在浏览器中使用缩放控件,则可以使用:

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


如果您想向用户显示一个与所有浏览器列表的对话,这样他可以选择首选,下面是示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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 :)

}


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

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


就像其他人写的解决方案一样(这很好用),我想回答同样的问题,但我认为大多数人更愿意使用这个提示。

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

1
2
3
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示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@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)
}


你也可以走这边

在XML中:

1
2
3
4
5
6
<?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代码中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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");

 }

}

在清单中不要忘记添加Internet权限…


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

也不要忘记AndroidManifest中的Internet权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
    }
}


在try块中,粘贴以下代码,android intent直接使用uri(统一资源标识符)括号中的链接来标识链接的位置。

您可以尝试以下操作:

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

一个简短的代码版本…

1
2
3
4
5
6
 if (!strUrl.startsWith("http://") && !strUrl.startsWith("https://")){
     strUrl="http://" + strUrl;
 }


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

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

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


Chrome自定义选项卡现在可用:

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

1
2
3
4
dependencies {
    ...
    compile 'com.android.support:customtabs:24.2.0'
}

然后,打开Chrome自定义选项卡:

1
2
3
4
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/multipdevice/android/customtabs


马克的回答是对的。在我的例子中,我使用的是Xamarin,与C和Xamarin一起使用的代码是:

1
2
3
var uri = Android.Net.Uri.Parse ("http://www.xamarin.com");
var intent = new Intent (Intent.ActionView, uri);
StartActivity (intent);

此信息摘自:https://developer.xamarin.com/recipes/android/fundamentals/intent/open_a_webpage_in_the_browser_application/


简单,通过意图查看网站,

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

使用这个简单的代码在Android应用程序中查看您的网站。

在清单文件中添加Internet权限,

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
    }
}

我觉得这是最好的

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

将下面的代码放入全局类

1
2
3
4
5
6
7
8
    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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}

使用这种方法可以使它通用。它不必放在特定的活动中,因为您可以这样使用它:

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

或者,如果要在活动外部启动它,只需在活动实例上调用StartActivity:

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

正如在这两个代码块中看到的,都有一个空检查。这是因为如果没有应用程序来处理意图,它将返回空值。

如果没有定义协议,则此方法默认为HTTP,因为有些网站没有SSL证书(HTTPS连接所需的证书),如果尝试使用HTTPS但没有,则这些网站将停止工作。任何一个网站仍然可以强制使用https,所以无论哪种方式,这些网站都会让你登陆https。

由于此方法使用外部资源来显示页面,因此不需要声明Internet权限。显示网页的应用程序必须这样做


//onclick侦听器

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

//使用方法

1
2
3
4
5
6
7
8
9
10
11
12
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);
        }

    }


基本介绍:

https://is using that one into the"code"so no one in between can read them.这可以保护您的信息不受黑客攻击。

http://is using just sharing purpose,it's not secured.http://is using just sharing purpose,it's not secured.http://is using just sharing purpose,it's not secured.http://is

关于你的问题:XML设计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.sridhar.sharedpreferencesstackoverflow.MainActivity">
   <LinearLayout
       android:orientation="horizontal"
       android:background="#228b22"
       android:layout_weight="1"
       android:layout_width="match_parent"
       android:layout_height="0dp">
      <Button
          android:id="@+id/normal_search"
          android:text="secure Search"
          android:onClick="secure"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="wrap_content" />
      <Button
          android:id="@+id/secure_search"
          android:text="Normal Search"
          android:onClick="normal"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="wrap_content" />
   </LinearLayout>

   <LinearLayout
       android:layout_weight="9"
       android:id="@+id/button_container"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:orientation="horizontal">

      <WebView
          android:id="@+id/webView1"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

   </LinearLayout>
</LinearLayout>

活动设计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class MainActivity extends Activity {
    //securely open the browser
    public String Url_secure="https://www.stackoverflow.com";
    //normal purpouse
    public String Url_normal="https://www.stackoverflow.com";

    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView=(WebView)findViewById(R.id.webView1);

    }
    public void secure(View view){
        webView.setWebViewClient(new SecureSearch());
        webView.getSettings().setLoadsImagesAutomatically(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        webView.loadUrl(Url_secure);
    }
    public void normal(View view){
        webView.setWebViewClient(new NormalSearch());
        webView.getSettings().setLoadsImagesAutomatically(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        webView.loadUrl(Url_normal);

    }
    public class SecureSearch extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String Url_secure) {
            view.loadUrl(Url_secure);
            return true;
        }
    }
    public class NormalSearch extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String Url_normal) {
            view.loadUrl(Url_normal);
            return true;
        }
    }
}

Android清单:XML权限:

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

在实现这一点时,你会面临一些问题:

  • 获取清单权限
  • URL之间的多余空间
  • 检查你的网址是否正确

  • 试试这个……为我工作!

    1
    2
    3
    4
    5
    6
    7
    8
    9
        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代码:

    1
    2
    3
    4
    5
    6
     <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"
            />

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


    android.webkit.URLUtil的方法guessUrl(String)工作得很好(即使与file://data://一起工作),因为Api level 1(android 1.0)。用作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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

    在活动呼叫中:

    1
    2
    3
    4
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(URLUtil.guessUrl(download_link)));

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

    查看完整的guessUrl代码以了解更多信息。


    好的,我检查了每个答案,但是哪个应用程序使用了用户想要使用的相同的URL进行了解编?

    今天我接了这个案子,答案是browserIntent.setPackage("browser_package_name");

    例如:

    1
    2
    3
       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);

    谢谢您!


    试试这个OmegaintentBuilder

    1
    2
    3
    4
    5
    OmegaIntentBuilder.from(context)
                    .web("Your url here")
                    .createIntentHandler()
                    .failToast("You don't have app for open urls")
                    .startActivity();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    dataWebView.setWebViewClient(new VbLinksWebClient() {
         @Override
         public void onPageFinished(WebView webView, String url) {
               super.onPageFinished(webView, url);
         }
    });




    public class VbLinksWebClient extends WebViewClient
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url.trim())));
            return true;
        }
    }

    简单最佳实践

    方法1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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*/
        }

    检查URL是否正确。对我来说,在URL之前有一个不需要的空间。


    只需在浏览器中打开一个简短的URL即可:

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


    如果要对XML执行此操作,而不是以编程方式执行此操作,则可以在TextView上使用:

    1
    2
    android:autoLink="web"
    android:linksClickable="true"