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

当前回答

我认为这是最好的

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

其他回答

科特林

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

    <application
    android: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>

主要活动.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 variable
    Resources 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();
    }
}

布局.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">

    <TextView
        android: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.FloatingActionButton
        android: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"/>

    <WebView
        android: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>

简短甜美的Kotlin助手功能:

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

简单的回答

你可以看到Android开发者的官方示例。

/**
 * 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 check语句吗?

对医生说:

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

奖金

创建Intent实例时,可以在一行中编写如下内容:

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

Kotlin溶液

所有答案都是在该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)
}