Как я могу открыть URL в веб-браузере Android из моего приложения? - PullRequest
1226 голосов
/ 04 февраля 2010

Как открыть 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

Ответы [ 31 ]

2273 голосов
/ 04 февраля 2010

Попробуйте это:

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, в который пользователь вводит URL, с помощью "http://".

75 голосов
/ 27 мая 2014

общий способ добиться этого с помощью следующего кода:

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

счастливого кодирования!

54 голосов
/ 16 марта 2011

В 2.3 мне повезло больше

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

Разница заключается в использовании Intent.ACTION_VIEW вместо строки "android.intent.action.VIEW"

50 голосов
/ 24 августа 2015

Простой ответ

Вы можете увидеть официальный образец от 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-адреса данных создается новое намерение.

А затем просто позвоните startActivity(Intent intent), чтобы начать новое действие, которое связано с намерением с данным URL.

Нужно ли if выписка с чеком?

Да. документы говорит:

Если на устройстве нет приложений, которые могут получить неявное намерение, ваше приложение будет аварийно завершено при вызове startActivity (). Чтобы сначала убедиться, что приложение существует для получения намерения, вызовите resolActivity () для объекта Intent. Если результат не нулевой, есть хотя бы одно приложение, которое может обработать намерение, и безопасно вызывать startActivity (). Если результат равен нулю, вам не следует использовать намерение и, если возможно, следует отключить функцию, которая вызывает намерение.

Бонус

Вы можете написать в одну строку при создании экземпляра Intent, как показано ниже:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
30 голосов
/ 31 августа 2012

Попробуйте:

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);
22 голосов
/ 09 января 2013

Если вы хотите показать пользователю диалог со всеми списками браузеров, чтобы он мог выбрать предпочитаемый, вот пример кода:

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

}
18 голосов
/ 08 апреля 2014

Как и решения, написанные другими (которые отлично работают), я хотел бы ответить на то же самое, но с подсказкой, которую, я думаю, большинство предпочло бы использовать.

Если вы хотите, чтобы приложение, которое вы начали открывать в новом задании, независимо от вас, вместо того, чтобы оставаться в одном стеке, вы можете использовать этот код:

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

Существует также способ открыть URL-адрес в пользовательских вкладках Chrome . Пример в Котлине:

@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)
}
17 голосов
/ 25 июня 2012

другой параметр В URL загрузки в том же приложении, используя Webview

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");
12 голосов
/ 19 декабря 2013

Вы также можете пойти по этому пути

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

 }

}

В Манифесте не забудьте добавить интернет-разрешение ...

9 голосов
/ 13 ноября 2015

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