Как я могу открыть 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
44 ответа
Попробуй это:
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://".
Распространенный способ добиться этого с помощью следующего кода:
String url = "http://www.stackru.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.stackru.com"));
startActivity(intent);
или же:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.stackru.com"));
startActivity(intent);
кратчайший!:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.stackru.com")));
Удачного кодирования!
Простой ответ
Вы можете увидеть официальный образец от 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
экземпляр для 2-го параметра, и новый Intent создается на основе заданного URL-адреса данных.
А потом просто позвоните startActivity(Intent intent)
начать новое действие, которое связано с намерением с указанным URL.
Нужно ли мне if
проверить заявление?
Да. Документы говорят:
Если на устройстве нет приложений, которые могут получить неявное намерение, ваше приложение будет аварийно завершено при вызове startActivity(). Чтобы сначала убедиться, что приложение существует для получения намерения, вызовите resolActivity () для объекта Intent. Если результат не нулевой, есть хотя бы одно приложение, которое может обработать намерение, и безопасно вызывать startActivity(). Если результат нулевой, вы не должны использовать намерение и, если возможно, вы должны отключить функцию, которая вызывает намерение.
бонус
Вы можете написать в одну строку при создании экземпляра Intent, как показано ниже:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
В 2.3 мне повезло больше
final Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url));
activity.startActivity(intent);
Разница заключается в использовании Intent.ACTION_VIEW
а не строка "android.intent.action.VIEW"
Котлинский ответ:
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://stackru.com".asUri().openInBrowser(context)
fun String?.asUri(): Uri? {
try {
return Uri.parse(this)
} catch (e: Exception) {}
return null
}
Попробуй это:
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 :)
}
Как и решения, написанные другими (которые отлично работают), я хотел бы ответить на то же самое, но с подсказкой, которую, я думаю, большинство предпочло бы использовать.
Если вы хотите, чтобы приложение, которое вы начали открывать в новой задаче, независимо от вас, вместо того, чтобы оставаться в одном стеке, вы можете использовать этот код:
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);
другой вариант в URL загрузки в том же приложении, используя Webview
webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");
Вы также можете пойти по этому пути
В 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 не забудьте добавить интернет-разрешение...
Так что я долго искал это, потому что все остальные ответы открывали приложение по умолчанию для этой ссылки, но не браузер по умолчанию, а это то, что я хотел.
Наконец-то мне это удалось:
// 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
Как бы то ни было, поскольку я использовал это для статического метода утилиты, если вы делаете это в действии, это не нужно.
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;
}
}
Вставьте в свой блок try следующий код. Android Intent напрямую использует ссылку в фигурных скобках URI(Uniform Resource Identifier), чтобы определить местоположение вашей ссылки.
Вы можете попробовать это:
Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
startActivity(myIntent);
Простая и лучшая практика
Способ 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*/
}
Краткая версия кода...
if (!strUrl.startsWith("http://") && !strUrl.startsWith("https://")){
strUrl= "http://" + strUrl;
}
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(strUrl)));
Краткая и приятная вспомогательная функция Kotlin :
private fun openUrl(link: String) =
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(link)))
Простой, просмотр сайта через намерение,
Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse("http://www.yoursite.in"));
startActivity(viewIntent);
Используйте этот простой код для просмотра вашего сайта в приложении для Android.
Добавить интернет-разрешение в файле манифеста,
<uses-permission android:name="android.permission.INTERNET" />
String url = "http://www.example.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
Пользовательские вкладки 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
Новый и лучший способ открывать ссылку с 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
Хорошо, я проверил каждый ответ, но какое приложение имеет глубокие ссылки с тем же 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);
Спасибо!
Intent getWebPage = new Intent(Intent.ACTION_VIEW, Uri.parse(MyLink));
startActivity(getWebPage);
Ответ Mark B прав. В моем случае я использую 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 в браузере:
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("YourUrlHere"));
startActivity(browserIntent);
Основываясь на ответе Марка Б и комментариях ниже:
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);
}
}
Этот способ использует метод, позволяющий вам вводить любую строку вместо фиксированного ввода. Это сохраняет некоторые строки кода, если их использовать многократно, так как для вызова метода нужно всего три строки.
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;
}
Использование этого метода делает его универсальным для использования. IT не нужно помещать в конкретную деятельность, так как вы можете использовать это следующим образом:
Intent i = getWebIntent("google.com");
if(i != null)
startActivity();
Или, если вы хотите запустить его вне действия, просто вызовите startActivity для экземпляра действия:
Intent i = getWebIntent("google.com");
if(i != null)
activityInstance.startActivity(i);
Как видно из обоих этих блоков кода, есть нулевая проверка. Это как он возвращает ноль, если нет приложения для обработки намерения.
Этот метод по умолчанию использует HTTP, если протокол не определен, так как есть сайты, у которых нет сертификата SSL (что вам нужно для подключения HTTPS), и они перестанут работать, если вы попытаетесь использовать HTTPS, а его там нет., Любой веб-сайт все еще может перейти на HTTPS, поэтому эти стороны в любом случае приводят вас к HTTPS.
Поскольку этот метод использует внешние ресурсы для отображения страницы, вам не нужно объявлять разрешение INternet. Приложение, которое отображает веб-страницу, должно сделать это
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
В разделе Активность звоните:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(URLUtil.guessUrl(download_link)));
if (intent.resolveActivity(getPackageManager()) != null)
startActivity(intent);
Проверьте полный guessUrl
код для получения дополнительной информации.
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 localContext = LocalContext.current
val browseIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com"))
startActivity(localContext, browseIntent, null)
Котлин
startActivity(Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse(your_link)
})