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

1126

Как открыть 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
  • 6
    Я думаю, что это из-за этого: android-developers.blogspot.com/2009/12/…
  • 1
    Почему это не работает на некоторых устройствах? даже если есть веб-браузер, он переходит в ActivityNotFoundException.
Показать ещё 1 комментарий
Теги:
url
android-intent
android-browser

28 ответов

2138
Лучший ответ

Попробуйте следующее:

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

  • 2
    За исключением того, что ваш код и mbaird не совпадают, насколько я могу судить по тому, что опубликовано. Убедитесь, что ваш URL имеет схему http:// - показанное исключение предполагает, что в вашем URL отсутствует схема.
  • 5
    Да ! Он пропустил http: //! URL вводится пользователем, есть ли способ автоматического форматирования?
Показать ещё 14 комментариев
63

общий способ достижения этого - со следующим кодом:

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

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

45

В 2.3 мне повезло с

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

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

  • 1
    что это другое?
  • 1
    Этот ответ мне очень помог. Я не знаю, в чем была разница, но у нас была проблема с 2.3, что это решило. Кто-нибудь знает, в чем разница в реализации?
Показать ещё 1 комментарий
36

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

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

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

Нужна ли инструкция проверки if?

Да. docs говорит:

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

Bonus

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

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
  • 3
    Это предполагает, что в указанном URL-адресе содержится http .
24

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

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);
  • 4
    Обратите внимание, что плагины и тому подобное отключены в WebView, и что для этого потребуются разрешения на доступ в Интернет. ( ссылка )
21

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

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

}
  • 5
    если есть несколько приложений, которые могут обрабатывать намерение, система автоматически предоставит выбор, верно?
  • 0
    какой смысл делать поля HTTP и HTTPS?
Показать ещё 3 комментария
15

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

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

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.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);
  • 0
    Будет ли выполнение новой задачи защищать исходное приложение от ошибок и сбоев в случае проблем с веб-браузером?
  • 0
    @TheOriginalAndroid Я не понимаю, какое это имеет отношение к сбоям и веб-браузеру. Пожалуйста, объясните, что вы пытаетесь сделать.
Показать ещё 2 комментария
14

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

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");
  • 0
    Обратите внимание, что плагины и тому подобное отключены в WebView, и что для этого потребуются разрешения на доступ в Интернет. ( ссылка )
10

Вы также можете пойти таким образом

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

 }

}

В Manifest не забудьте добавить разрешение на интернет...

  • 0
    Это интересно и отличается. Я думаю, таким образом, пользователь видит веб-браузер в моем приложении. Это правильно? Я приветствую.
6

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

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

Вы можете попробовать следующее:

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

Короткая версия кода...

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


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

Теперь доступны пользовательские вкладки Chrome:

На первом этапе добавляется библиотека поддержки пользовательских вкладок в файл build.gradle:

dependencies {
    ...
    compile 'com.android.support:customtabs:24.2.0'
}

Затем, чтобы открыть вкладку chrome custom:

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

3
String url = "http://www.example.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
3
Intent getWebPage = new Intent(Intent.ACTION_VIEW, Uri.parse(MyLink));          
startActivity(getWebPage);
  • 0
    Добро пожаловать, новичок. пожалуйста, сделайте ответ более полным, объявив переменные, которые не существуют в исходном коде.
2

Ответ MarkB прав. В моем случае я использую Xamarin, а код для использования с С# и 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/

2

Простой, просмотр веб-сайта с помощью намерения,

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

используйте этот простой код для просмотра вашего сайта в приложении Android.

Добавить доступ к Интернету в файле манифеста,

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

//Слушатель 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);
        }

    }
  • 0
    Где определяется «isURL»?
1

android.webkit.URLUtil имеет метод guessUrl(String), работающий отлично (даже с 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 code.

1

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

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);
    }
  • 0
    разрешение не требуется
1

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

0

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

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

Хорошо, я проверил каждый ответ, но какое приложение имеет deeplinking с тем же 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 using
    startActivity(browserIntent);

Спасибо!

0

Этот способ использует метод, позволяющий вам вводить любую 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 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, если нет приложения для обработки намерения.

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


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

0

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

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

--------- ИЛИ ------------------

String url = "";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
  • 0
    Для большинства приложений добавить WebView - сложный способ сделать это. Проще открыть URL в браузере.
  • 0
    Я не понизил.
0

На основании ответа Марка Б и комментариев ниже:

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

Основное введение:

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. получение разрешений Manifest
  2. избыточное пространство между URL-адресом
  3. Проверьте правильность вашего URL- адреса
-2

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню