アプリケーションのURLをAndroidのWebブラウザーで開くにはどうすればよいですか?


1346

アプリケーション内ではなく、組み込みの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

6
私はそれが、このためだと思う:android-developers.blogspot.com/2009/12/...
Arutha

1
一部のデバイスでこれが機能しないのはなぜですか?Webブラウザーがある場合でも、ActivityNotFoundExceptionに移動します。

@Manuと同じ問題が発生しています。Nexus 6への基本インストールにはクロームがありますが、リンクにより例外が発生します。
Brill Pappin、2015

回答:


2458

これを試して:

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;

また、おそらくユーザーが "http://"でURLを入力しているEditTextを事前に入力します。


2
あなたのコードとmbairdが同じではないことを除いて、投稿されたものについて私が知ることができるものから。URLにhttp://スキームがあることを確認してください-表示されている例外は、URLにスキームがないことを示しています。
CommonsWare 2010

5
はい !http://を逃しました!URLはユーザーが入力したものですが、自動的にフォーマットする方法はありますか?
Arutha

4
URLUtilは、ユーザーが入力した「url」文字列をチェックするための優れた方法です
Dan

90
if (!url.startsWith("http://") && !url.startsWith("https://"))file://のようなURLにつながり、いくつかの良いユースケースを壊す可能性のある一般的なエラーです。URIクラスを使用してURIを解析し、スキーマがあるかどうかを確認してください。いいえの場合は、「http://」を追加してください;)
tuxSlayer

22
でのnullチェックが必要resolveCheckです。公式ドキュメントをご覧ください。注意:暗黙のインテントを受信できるアプリがデバイスにない場合、startActivity()を呼び出すとアプリがクラッシュします。アプリが存在してインテントを受け取ることを最初に確認するには、インテントオブジェクトでresolveActivity()を呼び出します。
ケンジュ

91

これを実現する一般的な方法は、次のコードです。

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

幸せなコーディング!


58

簡単な答え

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番目のパラメータに渡すことができ、指定されたデータURLに基​​づいて新しいインテントが作成されます。

次に、呼び出しstartActivity(Intent intent)て、指定されたURLのインテントにバンドルされている新しいアクティビティを開始します。

ifチェックステートメントは必要ですか?

はい。ドキュメントは言います:

暗黙的インテントを受信できるデバイス上にアプリがない場合、startActivity()を呼び出すとアプリがクラッシュします。アプリが存在してインテントを受け取ることを最初に確認するには、インテントオブジェクトでresolveActivity()を呼び出します。結果がnull以外の場合、インテントを処理できるアプリが少なくとも1つあり、startActivity()を呼び出しても安全です。結果がnullの場合、インテントを使用しないでください。可能であれば、インテントを呼び出す機能を無効にする必要があります。

ボーナス

以下のように、Intentインスタンスを作成するときに1行で記述できます。

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

3
これは、提供されたURLにhttpが含まれていることを前提としています。
IgorGanapolsky

57

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
違いは何ですか?
user1324936 2013年

1
この答えは私を大いに助けてくれました。違いはわかりませんが、2.3で問題が解決しました。実装の違いが何か知っている人はいますか?
Innova

2
Androidデベロッパーによると、この回答-「指定されたアクションでインテントを作成します。他のすべてのフィールド(データ、タイプ、クラス)はnullです。」と受け入れられた答え-「特定のアクションと特定のデータURLでインテントを作成します。」
Teo Inke、2015年

30

これを試して:

Uri uri = Uri.parse("https://www.google.com");
startActivity(new Intent(Intent.ACTION_VIEW, uri));

または、アクティビティでWebブラウザを開く場合は、次のようにします。

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では無効になっていることに注意してください。また、インターネット権限が必要です。(参照

22

すべてのブラウザリストを含むダイアログをユーザーに表示したい場合は、ユーザーが優先を選択できるように、サンプルコードを次に示します。

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
インテントを処理できるアプリが複数ある場合、システムは自動的にセレクターを提供しますよね?
Jeffrey Blattman 2013

@ xmen-wkは、URLがhttpor httpsで開始できるため、Javaでは「マジックストリング」を定数として宣言することをお勧めします。
Dmytro Danylyk 2014

thx、について知りませんでしたcontext.startActivity。外部クラスから呼び出すときに非常に便利
WuerfelDev

18

他の人が書いたソリューション(それはうまくいく)と同じように、私は同じことを答えたいと思いますが、私が最も使用したいと思うヒントを付けます。

同じスタックにとどまるのではなく、独自の独立した新しいタスクでアプリを開きたい場合は、次のコードを使用できます。

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

Chromeカスタムタブで URLを開く方法もあります。Kotlinの例:

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

新しいタスクを作成すると、Webブラウザーに問題が発生した場合に、ソースアプリがバグやクラッシュから保護されますか?
オリジナルAndroid

@TheOriginalAndroidクラッシュやWebブラウザとの関係がわかりません。何をしようとしているか説明してください。
Android開発者

お返事をありがとうございます。あなたの投稿は興味深いものです。特にWebの起動のために新しいタスクを開く利点は何ですか?
オリジナルAndroid

2
@TheOriginalAndroidユーザーがアプリに切り替えてから、再びWebブラウザーに戻ることができるようにします。最近のタスク画面を開くと、1つではなく2つのタスクがここに表示されます。また、(アプリのタスクに属する)単一のタスクでWebブラウザーのサムネイルを表示する代わりに、2が表示されます:アプリの1つとWebブラウザーの別の2つ。この方法なら混乱が少ないと思います。
Android開発者

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETは非推奨です
Pratik Butani 19/07/30

17

その他のオプションWebviewを使用して同じアプリケーションにURLを読み込む

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");

プラグインなどはWebViewでは無効になっていることに注意してください。また、インターネット権限が必要です。(参照

12

この方法で行くこともできます

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

 }

}

マニフェストでは、インターネット許可を追加することを忘れないでください...


これは面白くて違います。私は、ユーザーが私のアプリでWebブラウザーを見るこの方法を推測します。そうですか?私は賛成です。
オリジナルAndroid

9

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


6

短いコードバージョン...

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


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

6

tryブロック内に次のコードを貼り付けます。AndroidIntentは、URI(Uniform Resource Identifier)ブレース内のリンクを直接使用して、リンクの場所を識別します。

あなたはこれを試すことができます:

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

5

シンプルでベストプラクティス

方法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*/
    }

context!!.packageManager代わりに使用getPackageManager()Fragmentます。
CoolMind


3
Intent getWebPage = new Intent(Intent.ACTION_VIEW, Uri.parse(MyLink));          
startActivity(getWebPage);

ようこそ、初心者。元のコードに存在しない変数を宣言して、答えをより完全なものにしてください。
トニーギル2014

3

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/


3

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


2

マークBの回答と以下のコメントに基づく:

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

2

android.webkit.URLUtil(Android 1.0)以降、(またはguessUrl(String)でも)完全に正常に動作するメソッドがあります。使用:file://data://Api level 1

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コードを確認してください。


2

さて、私はすべての回答をチェックしましたが、ユーザーが使用したいのと同じ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);

ありがとうございました!


いい答えです。システムがブラウザを選択することに依存せずに、特定のブラウザで(直接)インテントURLを開く方法について説明します。
Mr-IDE

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

2
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が原因で発生しました。AndroidOSはデータのアクションビューを見つけることができません。これで、URLが有効かどうかを確認できました。


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

1

この方法では、メソッドを使用して、固定入力の代わりに任意の文字列を入力できるようにします。メソッドを呼び出すために必要なのは3行だけなので、これを繰り返し使用すると、コードのいくつかの行が節約されます。

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

これらのコードブロックの両方に見られるように、nullチェックがあります。これは、インテントを処理するアプリがない場合はnullを返すためです。

プロトコルが定義されていない場合、このメソッドはデフォルトでHTTPになります。これは、SSL証明書(HTTPS接続に必要なもの)がないWebサイトがあり、HTTPSを使用しようとするとWebサイトが存在しないため、Webサイトが機能しなくなるためです。 。どのWebサイトでもHTTPSに強制的にアクセスできるため、どちらの方向でもHTTPSに到達します


このメソッドは外部リソースを使用してページを表示するため、インターネットのアクセス許可を宣言する必要はありません。ウェブページを表示するアプリはそれをしなければなりません


1

// OnClickリスナー

  @Override
      public void onClick(View v) {
        String webUrl = news.getNewsURL();
        if(webUrl!="")
        Utils.intentWebURL(mContext, webUrl);
      }

//あなたのUtilメソッド

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

    }

「isURL」はどこに定義されていますか?
Cabuxa.Mapache

1

短いものを使用して、ブラウザでURLを開きます。

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("YourUrlHere"));
startActivity(browserIntent);

1

コトリンの答え:

val browserIntent = Intent(Intent.ACTION_VIEW, uri)
ContextCompat.startActivity(context, browserIntent, null)

Uriこれをさらに簡単にするために拡張機能を追加しました

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

おまけとして、ここに文字列をUriに安全に変換する簡単な拡張関数があります。

fun String?.asUri(): Uri? {
    try {
        return Uri.parse(this)
    } catch (e: Exception) {}
    return null
}

1

他のすべての答えがそのリンクのデフォルトのアプリを開いていたが、デフォルトのブラウザではなかったので、私はこれを長い間探していましたが、それが私が欲しかったものです。

私はようやくそうすることができました:

// 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.whatに気づくことができます。私はこれを静的なutilメソッドに使用したので、アクティビティでこれを行っている場合、それは必要ありません。



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

ほとんどのアプリでは、WebViewを追加するのは難しい方法です。ブラウザでURLを開く方が簡単です。
ゾーイ2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.