Как я могу открыть URL-адрес в веб-браузере Android из моего приложения?

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

person Arutha    schedule 04.02.2010    source источник
comment
Думаю, это из-за этого: android-developers.blogspot.com / 2009/12 /   -  person Arutha    schedule 04.02.2010
comment
Почему это не работает на некоторых устройствах? даже если есть веб-браузер, он переходит в ActivityNotFoundException.   -  person    schedule 11.11.2015
comment
У меня та же проблема, что и у @Manu. Базовая установка на Nexus 6, хром, но ссылки вызывают исключение.   -  person Brill Pappin    schedule 11.12.2015
comment
можно скрыть адресную строку? @ Арута   -  person reza_khalafi    schedule 27.06.2021


Ответы (38)


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

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: //».

person Mark B    schedule 04.02.2010
comment
За исключением того, что ваш код и mbaird не совпадают, насколько я могу судить по опубликованным материалам. Убедитесь, что ваш URL-адрес имеет схему http:// - показанное исключение предполагает, что в вашем URL-адресе отсутствует схема. - person CommonsWare; 04.02.2010
comment
Да ! Он пропустил http: //! URL вводится пользователем, есть ли способ автоматического форматирования? - person Arutha; 04.02.2010
comment
Ему нужен был еще один ')' после '(google.com)', но в остальном он работал. Спасибо :-) - person Techboy; 02.07.2010
comment
URLUtil - отличный способ проверить введенные пользователем строки URL - person Dan; 21.06.2011
comment
При использовании Linkfy нет необходимости нормализовать url. Кто-нибудь знает, как происходит преобразование в Linkfy? - person Kostadin; 12.01.2012
comment
if (!url.startsWith("http://") && !url.startsWith("https://")) - распространенная ошибка, которая может привести к URL-адресам типа file: // и нарушить некоторые хорошие варианты использования. Попробуйте разобрать uri с помощью класса URI и проверить, есть ли схема. Если нет, добавьте http: //;) - person tuxSlayer; 19.04.2013
comment
Закодируйте строку запроса, если есть специальные символы или пробелы. тогда он будет работать потрясающе. Например: String query = For martin Luther King; query = URLEncoder.encode (запрос); Строка url = en.wikipedia.org/wiki/Special:Search?search= + запрос; Намерение browserIntent = новое намерение (Intent.ACTION_VIEW, Uri.parse (url)); startActivity (browserIntent); - person Chaitu; 06.09.2013
comment
отличный ответ. Мне очень нравится if (! url.startsWith (http: //) &&! url.startsWith (https: //)) url = http: // + url; - person user1324936; 18.11.2013
comment
А как насчет if (! Url.contains (: //)? Это не повредит file: // и другие - person Torsten Ojaperv; 16.10.2014
comment
Пользователь Apache UrlValidator для таких операций: UrlValidator.getInstance().isValid(url) - person To Kra; 06.03.2015
comment
Вам нужна нулевая проверка с помощью resolveCheck. См. официальную документацию: Внимание! Если на устройстве нет приложений, которые могут получать неявное намерение, ваше приложение выйдет из строя при вызове startActivity (). Чтобы сначала убедиться, что приложение существует для получения намерения, вызовите resolveActivity () для своего объекта Intent. - person kenju; 24.08.2015
comment
@MarthaJames Если есть лучший способ сделать это сейчас, опубликуйте его в качестве ответа. - person Mark B; 21.05.2016
comment
com.android.chrome E / chromium: [ERROR: layer_tree_host_impl.cc (2206)] Принудительная инициализация плитки с нулевым копированием, поскольку отсутствует рабочий контекст - person Iman Marashi; 14.10.2017
comment
как я могу использовать его без вариантов ссылок на контент в моем приложении? - person ; 26.05.2018
comment
спасибо, лучшее решение - person Squareoot; 31.12.2020

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

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

or :

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

удачного кодирования!

person Jorgesys    schedule 27.05.2014

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

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

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

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

да. В документах говорится:

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

Бонус

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

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
person kenju    schedule 24.08.2015
comment
Это предполагает, что предоставленный URL содержит http. - person IgorGanapolsky; 15.05.2017

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

person MikeNereson    schedule 16.03.2011
comment
в чем разница? - person user1324936; 18.11.2013
comment
Этот ответ мне очень помог. Я не знаю, в чем разница, но у нас была проблема с 2.3, которую это решило. Кто-нибудь знает, в чем разница в реализации? - person Innova; 06.12.2013
comment
По словам разработчика Android: этот ответ - создать намерение с заданным действием. Все остальные поля (данные, тип, класс) равны нулю. и принятый ответ - Создайте намерение с заданным действием и для заданного URL-адреса данных. - person Teo Inke; 21.05.2015

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

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);
person nikki    schedule 31.08.2012
comment
Обратите внимание, что плагины и тому подобное отключены в WebView, и что потребуются разрешения ИНТЕРНЕТ. (ссылка) - person ; 11.06.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 :)

}
person Dmytro Danylyk    schedule 09.01.2013
comment
если есть несколько приложений, которые могут обрабатывать намерение, система автоматически предоставит средство выбора, верно? - person Jeffrey Blattman; 18.04.2013
comment
@ xmen-w-k, потому что url может запускать эфир с http или https, а в java рекомендуется объявлять «волшебные строки» как константы. - person Dmytro Danylyk; 26.12.2014
comment
спасибо, не знал о context.startActivity. Очень полезно при вызове из внешнего класса - person WuerfelDev; 15.08.2016

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

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

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)
}
person android developer    schedule 08.04.2014
comment
Будет ли создание новой задачи защищать исходное приложение от ошибок и сбоев в случае возникновения проблем с веб-браузером? - person The Original Android; 14.08.2015
comment
@TheOriginalAndroid Я не понимаю, при чем тут сбои и веб-браузер. Пожалуйста, объясните, что вы пытаетесь сделать. - person android developer; 14.08.2015
comment
Спасибо за ваш ответ. Ваш пост интересный. Какая польза от открытия новой задачи специально для веб-запуска? - person The Original Android; 14.08.2015
comment
@TheOriginalAndroid Только для того, чтобы пользователь мог вернуться к вашему приложению, а затем снова к веб-браузеру. Если вы откроете экран недавних задач, вы увидите здесь 2 задачи вместо одной. Кроме того, вместо миниатюры веб-браузера в одной задаче (которая относится к задаче вашего приложения) вы увидите 2: одно из вашего приложения, а другое из веб-браузера. Я думаю, так это не так запутанно. - person android developer; 14.08.2015
comment
FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET устарел - person Pratik Butani; 30.07.2019

другой вариант "Загрузить URL-адрес в том же приложении с помощью Webview"

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");
person Sanket    schedule 25.06.2012
comment
Обратите внимание, что плагины и тому подобное отключены в WebView, и что потребуются разрешения ИНТЕРНЕТ. (ссылка) - person ; 11.06.2013
comment
Также обратите внимание, что .setJavaScriptEnabled(true); опасно. - person dan1st; 07.03.2021

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

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

 }

}

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

person Aristo Michael    schedule 19.12.2013
comment
Это интересно и по-другому. Я предполагаю, что таким образом пользователь видит веб-браузер в моем приложении. Это правильно? Я голосую за. - person The Original Android; 14.08.2015

Котлинский ответ:

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? {
    try {
        return Uri.parse(this)
    } catch (e: Exception) {}
    return null
}
person Gibolt    schedule 03.01.2020
comment
Ничего интересного не добавляет. Даже не будет работать, если нет приложения, обрабатывающего URL. Произойдет сбой за исключением. - person CoolMind; 23.06.2020
comment
На всех устройствах должно быть приложение для обработки URL. При необходимости вы можете добавить свою собственную обработку сбоев / исключений, - person Gibolt; 23.06.2020
comment
Согласен с тобой. - person CoolMind; 23.06.2020

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;
    }
}
person Gorav Sharma    schedule 12.11.2015
comment
Это устранило мою проблему с видео: github.com/CrandellWS/VideoEnabledWebView/blob/master/app/src/ - person CrandellWS; 15.02.2016

В блоке try вставьте следующий код. Android Intent напрямую использует ссылку в фигурных скобках URI (Uniform Resource Identifier) ​​для определения местоположения вашей ссылки.

Вы можете попробовать это:

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

Версия сокращенного кода ...

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


 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(strUrl)));
person Jorgesys    schedule 03.12.2013

Простая и передовая практика

Метод 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*/
    }
person Umasankar    schedule 11.03.2019
comment
Используйте context!!.packageManager вместо getPackageManager() в Fragment. - person CoolMind; 10.02.2020

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

Наконец-то мне это удалось:

// 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. Что угодно, потому что я использовал это для статического метода утилиты, если вы делаете это в действии, это не нужно.

person bopol    schedule 28.04.2020

Ответ 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/

person Juan Carlos Velez    schedule 11.07.2017

Теперь доступны настраиваемые вкладки 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

person francisco_ssb    schedule 19.08.2016

Простой просмотр веб-сайта через намерение

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

используйте этот простой код, чтобы просмотреть свой сайт в приложении для Android.

Добавьте разрешение в Интернете в файл манифеста

<uses-permission android:name="android.permission.INTERNET" /> 
person stacktry    schedule 08.11.2014

Основываясь на ответе Марка Б и приведенных ниже комментариях:

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);
    }
}
person divonas    schedule 16.12.2016
comment
Я бы нанял вас в любой день .. Кодекс заботы. Спасибо - person Fattie; 28.03.2021

android.webkit.URLUtil имеет метод guessUrl(String) < / strong> отлично работает (даже с file:// или data://), начиная с Api level 1 (Android 1.0). Использовать как:

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

В вызове Activity:

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

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

Проверьте полный guessUrl код для получения дополнительной информации.

person I.G. Pascual    schedule 21.06.2017

Хорошо, я проверил все ответы, но какое приложение имеет глубокую ссылку с тем же URL-адресом, который пользователь хочет использовать?

Сегодня получил это дело и ответ browserIntent.setPackage("browser_package_name");

e.g. :

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

Спасибо!

person Vaibhav Kadam    schedule 10.01.2018
comment
Хороший ответ. В нем объясняется, как открыть URL-адрес намерения в конкретном браузере (напрямую), а не полагаться на то, что система выбирает браузер. - person Mr-IDE; 10.02.2020

Просто выберите короткий, чтобы открыть свой URL-адрес в браузере:

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("YourUrlHere"));
startActivity(browserIntent);
person Gaurav Lambole    schedule 02.04.2019
comment
можно открыть его только в приложении, например, в веб-просмотре или что-то в этом роде. - person The Rahul Jha; 06.09.2020

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.

person Mayur Sojitra    schedule 22.08.2019

Я думаю это лучший

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);
    }
person Karthik Sridharan    schedule 05.10.2016

В этом случае используется метод, позволяющий вводить любую строку вместо фиксированного ввода. Это позволяет сэкономить несколько строк кода при повторном использовании, так как вам нужно всего три строки для вызова метода.

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

Использование этого метода делает его универсальным. Информационные технологии не обязательно должны быть связаны с конкретным видом деятельности, их можно использовать следующим образом:

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

Или, если вы хотите запустить его вне действия, вы просто вызываете startActivity для экземпляра действия:

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

Как видно в обоих этих блоках кода, есть проверка на null. Это означает, что он возвращает значение null, если нет приложения для обработки намерения.

По умолчанию для этого метода используется HTTP, если протокол не определен, поскольку есть веб-сайты, у которых нет сертификата SSL (что вам нужно для HTTPS-соединения), и они перестанут работать, если вы попытаетесь использовать HTTPS, а его там нет. . Любой веб-сайт по-прежнему может принудительно перейти на HTTPS, поэтому эти стороны в любом случае переводят вас на HTTPS.


Поскольку этот метод использует внешние ресурсы для отображения страницы, вам не нужно объявлять разрешение INternet. Приложение, которое отображает веб-страницу, должно это делать.

person Zoe    schedule 01.05.2017

// Слушатель OnClick

  @Override
      public 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);
        }

    }
person Faakhir    schedule 22.01.2018
comment
Где определяется isURL? - person Cabuxa.Mapache; 20.04.2018

Котлин

startActivity(Intent(Intent.ACTION_VIEW).apply {
            data = Uri.parse(your_link)
        })
person Cube    schedule 04.02.2020

Из Anko библиотечный метод

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
    }
}
person Vlad    schedule 13.10.2020
comment
Anko устарел. Дополнительную информацию см. На этой странице. - person phillipsK; 31.12.2020
comment
@phillipsK Anko устарел, но не Android SDK - person Vlad; 31.12.2020

Краткая и приятная вспомогательная функция Kotlin:

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

Проверьте правильность вашего URL. Для меня перед URL-адресом был нежелательный пробел.

person Sonia John Kavery    schedule 12.10.2015

Если вы хотите сделать это с помощью XML, а не программно, вы можете использовать его в TextView:

android:autoLink="web"
android:linksClickable="true"
person Salam El-Banna    schedule 19.01.2017

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

OmegaIntentBuilder.from(context)
                .web("Your url here")
                .createIntentHandler()
                .failToast("You don't have app for open urls")
                .startActivity();
person T. Roman    schedule 23.01.2018

Введение:

https: // использует его в «коде», чтобы никто между ними не мог их прочитать. Это защищает вашу информацию от хакеров.

http: // использует только цель совместного использования, это не защищено.

О вашей проблеме:
Разработка 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">
   <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>

Проектирование деятельности:

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 Manifest.Xml:

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

Вы сталкиваетесь с проблемами при реализации этого:

  1. получение разрешений манифеста
  2. лишнее пространство между URL
  3. Проверьте правильность своего URL-адреса.
person ballu    schedule 29.07.2016

попробуйте этот код

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>

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

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

    <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>
person pankaj kumar    schedule 03.04.2020

Разработчики Kotlin могут использовать это

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)
    }
person Kishan Solanki    schedule 02.10.2020

Новый и лучший способ открывать ссылку с URL-адреса в Android 11.

  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 dialog
            addCategory(CATEGORY_BROWSABLE)
            flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER or
                    FLAG_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-cc857f221cd9 и https://developer.android.com/training/package-visibility/use-cases#avoid-a-disambiguation-dialog.

person chia yongkang    schedule 10.06.2021

Попробуйте это .. Сработало для меня!

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

--------- OR------------------

String url = "";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
person Debasish Ghosh    schedule 30.03.2017
comment
Для большинства приложений добавление WebView - сложный способ. Открыть URL-адрес в браузере проще. - person Zoe; 01.05.2017

person    schedule
comment
добро пожаловать, новичок. сделайте ответ более полным, объявив переменные, которых нет в исходном коде. - person tony gil; 17.07.2014