如何从我的应用程序在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
1117952 次浏览

试试这个:

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

这对我来说很好。

至于缺失的“超文本传输协议://”,我只是这样做:

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

我还可能会预先填充用户正在使用“超文本传输协议://”键入URL的EditText。

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

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

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

试试这个:

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

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

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

短代码版本…

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

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

你也可以走这条路

在xml中:

<?xml version="1.0" encoding="utf-8"?><WebViewxmlns: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");
}
}

在清单不要忘记添加互联网权限…

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

你可以试试这个:

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

就像其他人写的解决方案一样(效果很好),我想回答同样的事情,但我认为大多数人更愿意使用的技巧。

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

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。静态编程语言示例:

@JvmStaticfun openWebsite(activity: Activity, websiteUrl: String, useWebBrowserAppAsFallbackIfPossible: Boolean) {var websiteUrl = websiteUrlif (TextUtils.isEmpty(websiteUrl))returnif (websiteUrl.startsWith("www"))websiteUrl = "http://$websiteUrl"else if (!websiteUrl.startsWith("http"))websiteUrl = "http://www.$websiteUrl"val finalWebsiteUrl = websiteUrl//https://github.com/GoogleChrome/custom-tabs-clientval webviewFallback = object : CustomTabActivityHelper.CustomTabFallback {override fun openUri(activity: Activity, uri: Uri?) {var intent: Intentif (useWebBrowserAppAsFallbackIfPossible) {intent = Intent(Intent.ACTION_VIEW, Uri.parse(finalWebsiteUrl))intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORYor 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 URLintent = 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_HISTORYor Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)CustomTabActivityHelper.openCustomTab(activity, customTabsIntent, uri, webviewFallback)}

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

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")));
Intent getWebPage = new Intent(Intent.ACTION_VIEW, Uri.parse(MyLink));startActivity(getWebPage);
String url = "http://www.example.com";Intent i = new Intent(Intent.ACTION_VIEW);i.setData(Uri.parse(url));startActivity(i);

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

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

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

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

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

简单答案

你可以看到来自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);}}

它是如何运作的

请查看#0的构造函数:

public Intent (String action, Uri uri)

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

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

我需要if检查语句吗?

是的。文档表示:

如果设备上没有可以接收隐式意图的应用程序,那么你的应用程序在调用start Activity()时会崩溃。要首先验证是否存在用于接收意图的应用程序,请在你的Intent对象上调用解决方案活动()。如果结果为非空,则至少有一个应用程序可以处理意图,并且调用start Activity()是安全的。如果结果为空,则不应使用意图,如果可能,应禁用调用意图的功能。

奖金

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

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

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

Webview可用于在应用程序中加载URL。URL可以在文本视图中从用户提供,也可以硬编码。

另外,不要忘记在Android清单中的互联网权限。

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 {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}}

基础介绍:

https://是在“代码”中使用那个,这样中间的人就不会读取它们。这可以保护您的信息免受黑客攻击。

超文本传输协议://只是使用共享目的,它不安全。

关于你的问题:
XML设计:

<?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"><LinearLayoutandroid:orientation="horizontal"android:background="#228b22"android:layout_weight="1"android:layout_width="match_parent"android:layout_height="0dp"><Buttonandroid:id="@+id/normal_search"android:text="secure Search"android:onClick="secure"android:layout_weight="1"android:layout_width="0dp"android:layout_height="wrap_content" /><Buttonandroid: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>
<LinearLayoutandroid:layout_weight="9"android:id="@+id/button_container"android:layout_width="match_parent"android:layout_height="0dp"android:orientation="horizontal">
<WebViewandroid:id="@+id/webView1"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout></LinearLayout>

活动设计:

public class MainActivity extends Activity {//securely open the browserpublic String Url_secure="https://www.stackoverflow.com";//normal purpousepublic String Url_normal="https://www.stackoverflow.com";
WebView webView;
@Overrideprotected 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{@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String Url_secure) {view.loadUrl(Url_secure);return true;}}public class NormalSearch extends WebViewClient{@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String Url_normal) {view.loadUrl(Url_normal);return true;}}}

安卓清单. xml权限:

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

您在执行此操作时遇到问题:

  1. 获取清单权限
  2. url之间的多余空间
  3. 检查你的url的是否正确

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

我想这是最好的

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

根据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);}}

如果您想以非编程方式使用XML执行此操作,您可以在TextView上使用:

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

这种方式使用一个方法,允许您输入任何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 intentIntent 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 intentreturn intent;}//If there is no app, return null.return null;}

使用此方法使其可普遍使用。IT不必放在特定的活动中,因为你可以像这样使用它:

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

或者,如果你想在一个活动之外启动它,你只需在活动实例上调用start Activity:

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

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

如果没有定义协议,此方法默认为HTTP,因为有些网站没有SSL证书(HTTPS连接所需的证书),如果您尝试使用HTTPS并且它不在那里,这些证书将停止工作。任何网站仍然可以强制转换为HTTPS,因此这些方面无论如何都会让您使用HTTPS


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

Api level 1(Android 1.0)以来,android.webkit.URLUtil的方法#1运行得非常好(即使使用file://data://)。用作:

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

查看完整的#0代码以获取更多信息。

MarkB的响应是正确的。在我的情况下,我使用的是Xamarin,与C#和Xamarin一起使用的代码是:

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/

我检查了每个答案,但是哪个应用程序具有用户想要使用的相同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 usingstartActivity(browserIntent);

//OnClick监听器

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

//你的使用方法

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

试试这个OmegaIntentBuilder开发工具

OmegaIntentBuilder.from(context).web("Your url here").createIntentHandler().failToast("You don't have app for open urls").startActivity();
dataWebView.setWebViewClient(new VbLinksWebClient() {@Overridepublic void onPageFinished(WebView webView, String url) {super.onPageFinished(webView, url);}});



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

简单和最佳实践

方法一:

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 ToastorOpen play store to download browser*/}

方法二:

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

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

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("YourUrlHere"));startActivity(browserIntent);
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();}

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

静态编程语言:

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

我在Uri上添加了一个扩展,使其更容易

myUri.openInBrowser(context)
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。

"https://stackoverflow.com".asUri()?.openInBrowser(context)
fun String?.asUri(): Uri? {return try {Uri.parse(this)} catch (e: Exception) {null}}

静态编程语言

startActivity(Intent(Intent.ACTION_VIEW).apply {data = Uri.parse(your_link)})

试试这个代码

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.example.myapplication5">
<uses-permission android:name="android.permission.INTERNET" />
<applicationandroid:usesCleartextTraffic="true"android:allowBackup="true"...../><activity android:name=".MainActivity"android:screenOrientation="portrait"tools:ignore="LockedOrientationActivity"><intent-filter><action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

MainActivity.java

import android.app.Activity;import android.content.res.Resources;import android.os.Bundle;import android.view.View;import android.view.Window;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;
public class MainActivity extends Activity {private WebView mWebview;String link = "";// global variableResources res;// global variable
@Override

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.home);
loadWebPage();}
public void loadWebPage(){mWebview = (WebView) findViewById(R.id.webView);WebSettings webSettings = mWebview.getSettings();webSettings.setJavaScriptEnabled(true);webSettings.setUseWideViewPort(true);webSettings.setLoadWithOverviewMode(true);final Activity activity = this;mWebview.setWebViewClient(new WebViewClient() {public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {Toast.makeText(activity, description, Toast.LENGTH_SHORT).show();}});mWebview.loadUrl("http://www.google.com");
}
public void reLoad(View v){loadWebPage();}}

Layout.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">
<TextViewandroid:id="@+id/textView"android:layout_width="335dp"android:layout_height="47dp"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_marginStart="9dp"android:layout_marginTop="8dp"android:paddingLeft="10dp"android:paddingTop="5dp"android:text="URL : https://ktmmovie.co/"android:textSize="18dp"android:layout_marginLeft="9dp"android:layout_alignParentLeft="true" />
<com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/floatingActionButton2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_alignParentEnd="true"android:layout_marginStart="7dp"android:layout_marginLeft="7dp"android:layout_marginEnd="8dp"android:layout_toEndOf="@+id/textView"android:layout_toRightOf="@+id/textView"android:clickable="true"android:src="@android:drawable/ic_popup_sync"android:layout_marginRight="8dp"android:layout_alignParentRight="true"android:onClick="reLoad"/>
<WebViewandroid:id="@+id/webView"android:layout_width="401dp"android:layout_height="665dp"android:layout_below="@+id/textView"android:layout_alignParentStart="true"android:layout_alignParentLeft="true"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginStart="3dp"android:layout_marginLeft="3dp"android:layout_marginTop="3dp"android:layout_marginBottom="7dp" />

</RelativeLayout>

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

我终于做到了:

// gathering the default browserfinal 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.whatever,因为我已经将其用于静态util方法,如果您在活动中执行此操作,则不需要它。

静态编程语言开发者可以用这个

var webpage = Uri.parse(url)if (!url.startsWith("http://") && !url.startsWith("https://")) {webpage = Uri.parse("http://$url")}val intent = Intent(Intent.ACTION_VIEW, webpage)if (intent.resolveActivity(packageManager) != null) {startActivity(intent)}

来自安科库方法

fun Context.browse(url: String, newTask: Boolean = false): Boolean {try {val intent = Intent(Intent.ACTION_VIEW)intent.data = Uri.parse(url)if (newTask) {intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)}startActivity(intent)return true} catch (e: ActivityNotFoundException) {e.printStackTrace()return false}}

简短而甜蜜静态编程语言辅助函数:

private fun openUrl(link: String) =startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(link)))

在Android 11中从URL打开链接的一种新的更好的方法。

  try {val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {// The URL should either launch directly in a non-browser app// (if it’s the default), or in the disambiguation dialogaddCategory(CATEGORY_BROWSABLE)flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER orFLAG_ACTIVITY_REQUIRE_DEFAULT}startActivity(intent)} catch (e: ActivityNotFoundException) {// Only browser apps are available, or a browser is the default app for this intent// This code executes in one of the following cases:// 1. Only browser apps can handle the intent.// 2. The user has set a browser app as the default app.// 3. The user hasn't set any app as the default for handling this URL.openInCustomTabs(url)}

参考文献:

https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9https://developer.android.com/training/package-visibility/use-cases#avoid-a-disambiguation-dialog

静态编程语言解决方案

所有的答案都是在默认应用程序中为该URL打开url。我想始终在浏览器中打开任何URL。我需要在kotlin中找到一些解决方案并实现了下面的代码。

fun getPackageNameForUrl(context: Context, url: String): String? {val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))val resolveInfo = context.packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY)return resolveInfo?.activityInfo?.packageName}
fun openInBrowser(context: Context, url: String) {val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))val packageName = getPackageNameForUrl(context, "http://")packageName?.takeIf {it == "android"}?.let { intent.setPackage(defaultBrowserPackageName); }startActivity(context, intent, null)}

科林扩展函数。

 fun Activity.openWebPage(url: String?) = url?.let {val intent = Intent(Intent.ACTION_VIEW, Uri.parse(it))if (intent.resolveActivity(packageManager) != null) startActivity(intent)}