web-dev-qa-db-ja.com

Androidにリンクを強制的に開いてChromeで開く方法はありますか?

現在、多くのjQueryアニメーションを使用して開発されたWebアプリをテストしていますが、組み込みのWebブラウザーのパフォーマンスが非常に低いことがわかりました。 Chromeでテストしている間、webappのパフォーマンスは信じられないほど速いです。 iOSで行われているのと同様に、AndroidでChromeでリンクを強制的に開くスクリプトの種類があるかどうか疑問に思っています。

57
user1607943

これを実現するよりエレガントな方法は、Intent.ACTION_VIEW通常通りの意図ですが、パッケージを追加com.Android.chrome意図に。これは、Chromeがデフォルトのブラウザであるかどうかに関係なく機能し、ユーザーが選択リストからChromeを選択した場合とまったく同じ動作を保証します。

String urlString = "http://mysuperwebsite";
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(urlString));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage("com.Android.chrome");
try {
    context.startActivity(intent);
} catch (ActivityNotFoundException ex) {
    // Chrome browser presumably not installed so allow user to choose instead
    intent.setPackage(null);
    context.startActivity(intent);
}

更新

Kindleデバイスの場合:

chromeアプリがAmazon Kindleにインストールされていない場合にAmazon Default Browserを開きたい場合に備えて

String urlString = "http://mysuperwebsite";
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(urlString));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage("com.Android.chrome");
try {
    context.startActivity(intent);
} catch (ActivityNotFoundException ex) {
    // Chrome browser presumably not installed and open Kindle Browser
    intent.setPackage("com.Amazon.cloud9");
    context.startActivity(intent);
}
66
Martin

2つの解決策があります。

パッケージごと

    String url = "http://www.example.com";
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.setPackage("com.Android.chrome");
    try {
        startActivity(i);
    } catch (ActivityNotFoundException e) {
        // Chrome is probably not installed
        // Try with the default browser
        i.setPackage(null);
        startActivity(i);
    }

スキーム別

    String url = "http://www.example.com";
    try {
        Uri uri = Uri.parse("googlechrome://navigate?url=" + url);
        Intent i = new Intent(Intent.ACTION_VIEW, uri);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
    } catch (ActivityNotFoundException e) {
        // Chrome is probably not installed
    }

警告!次のテクニック動作しません Androidの最新バージョンでは。このソリューションはしばらく前から存在しているため、参照用です。

    String url = "http://www.example.com";
    try {
        Intent i = new Intent("Android.intent.action.MAIN");
        i.setComponent(ComponentName.unflattenFromString("com.Android.chrome/com.Android.chrome.Main"));
        i.addCategory("Android.intent.category.LAUNCHER");
        i.setData(Uri.parse(url));
        startActivity(i);
    }
    catch(ActivityNotFoundException e) {
        // Chrome is probably not installed
    }
45
philippe_b

提案されたすべてのソリューションはもう機能しません。 @pixelbanditoのおかげで、彼は正しい方向を示してくれました。 chromeソースで次の定数を見つけました

public static final String GOOGLECHROME_NAVIGATE_PREFIX = "googlechrome://navigate?url=";

そして次の使用法:

 Intent intent = new Intent("Android.intent.action.VIEW", Uri.parse("googlechrome://navigate?url=chrome-native://newtab/"));

解決策は次のとおりです(URLはエンコードしないでください)

void openUrlInChrome(String url) {
    try {
        try {
            Uri uri = Uri.parse("googlechrome://navigate?url="+ url);
            Intent i = new Intent(Intent.ACTION_VIEW, uri);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        } catch (ActivityNotFoundException e) {
            Uri uri = Uri.parse(url);
            // Chrome is probably not installed
            // OR not selected as default browser OR if no Browser is selected as default browser
            Intent i = new Intent(Intent.ACTION_VIEW, uri);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }
    } catch (Exception ex) {
        Timber.e(ex, null);
    }
}
8
httpdispatch

これはFirefoxおよびOperaで動作します

document.location = 'googlechrome://navigate?url=www.example.com/';

6
Tim Smith

@philippe_bの答えを追って、Chromeがインストールされていない場合、このコードは機能しないことを追加します。それが機能しない場合がもう1つありますChromeはデフォルトのブラウザとして選択されていません(ただしインストールされています)ORデフォルトとしてブラウザが選択されていない場合でも。

そのような場合は、コードの次のcatch部分も追加します。

try {
    Intent i = new Intent("Android.intent.action.MAIN");
    i.setComponent(ComponentName.unflattenFromString("com.Android.chrome/com.Android.chrome.Main"));
   i.addCategory("Android.intent.category.LAUNCHER");
    i.setData(Uri.parse("http://mysuperwebsite"));
    startActivity(i);
}
catch(ActivityNotFoundException e) {
// Chrome is probably not installed 
// OR not selected as default browser OR if no Browser is selected as default browser
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("somesite.com"));
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(i);
}
2
user1406716

私が見つけた最も近いものは次のとおりです。URLを記述してhttpgooglechromeに置き換えるとChromeが開きますが、指定したURLが開かないようです。 Samsung Galaxy S5、Android 5.0を使用しています

それは私が見つけた中で最高です-SOで見た他のすべてのソリューションには、webappではなくAndroidアプリが必要です。

2
pixelbandito

Google Playには、さまざまなchromeさまざまな機能を備えたブラウザアプリがあります

すべてをチェックするのは正しいことです

fun Context.openChrome(url: String, onError: (() -> Unit)? = null) {
    openBrowser("com.Android.chrome", url) {
        openBrowser("com.Android.beta", url) {
            openBrowser("com.Android.dev", url) {
                openBrowser("com.Android.canary", url) {
                    onError?.invoke() ?: openBrowser(null, url)
                }
            }
        }
    }
}

fun Context.openBrowser(packageName: String?, url: String, onError: (() -> Unit)? = null) {
    try {
        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
            setPackage(packageName)
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        })
    } catch (e: ActivityNotFoundException) {
        onError?.invoke()
    }
}
0
Vlad

TAG定数に関するエラーが発生した場合は、このコードをアクティビティに追加してください。

private static final String TAG = "MainActivity";
0

上記のさまざまな答えは良いですが、完全なものはありません。これはすべて私に最適でした:

chrome Webブラウザーを開いて、例外が発生した場合(chromeがデフォルトでないかインストールされていない)、ユーザーからブラウザーを選択するように求められます:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uriString));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                intent.setPackage("com.Android.chrome");
                try {
                    Log.d(TAG, "onClick: inTryBrowser");
                    startActivity(intent);
                } catch (ActivityNotFoundException ex) {
                    Log.e(TAG, "onClick: in inCatchBrowser", ex );
                    intent.setPackage(null);
                    startActivity(intent.createChooser(intent, "Select Browser"));
                }
0
Tushar Seth