Gibt es in Android eine Möglichkeit, das Öffnen eines Links in Chrome zu erzwingen?

69

Ich teste derzeit eine Webanwendung, die mit vielen jQuery-Animationen entwickelt wurde, und wir haben festgestellt, dass die Leistung des integrierten Webbrowsers sehr schlecht ist. Beim Testen in Chrome ist die Leistung der Webanwendung unglaublich schneller. Ich frage mich nur, ob es irgendeine Art von Skript gibt, die das Öffnen eines Links in Chrome für Android erzwingt, ähnlich wie in iOS.

user1607943
quelle
10
Was ist, wenn Chrome nicht auf dem Gerät installiert ist?
Eric
@ Eric Sie möchten dies
Maveň

Antworten:

76

Eine elegantere Möglichkeit, dies zu erreichen, besteht darin, die Intent.ACTION_VIEWAbsicht wie gewohnt zu verwenden, das Paket com.android.chromejedoch der Absicht hinzuzufügen . Dies funktioniert unabhängig davon, ob Chrome der Standardbrowser ist, und stellt genau das gleiche Verhalten sicher, als hätte der Benutzer Chrome aus der Auswahlliste ausgewählt.

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

Aktualisieren

Für Kindle-Geräte:

Nur für den Fall, dass Sie den Amazon-Standardbrowser öffnen möchten, falls die Chrome-App nicht auf dem Amazon Kindle installiert ist

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);
}
Martin
quelle
FWIW, um dies auf einem Kindle zu tun und Silk zum Öffnen zu zwingen (anstatt dass der Benutzer Shop Amazon als Option erhält), verwenden Sie: intent.setPackage ("com.amazon.cloud9");
Markdwhite
@markdwhite In meinem Kindle-Gerät habe ich beides und dieser Code öffnet Chrome einfach perfekt .
Maveň
@ MaňishYadav - du hast den Punkt verpasst. Wenn Chrome nicht installiert ist und die gewünschte Aktion darin besteht, das Öffnen des Silk-Browsers zu erzwingen, verwenden Sie meinen Vorschlag (der hinzugefügt wurde, falls jemand hier landen muss, um Silk zu öffnen, wenn Chrome nicht vorhanden ist)
markdwhite
@markdwhite Wenn es in einem Gerätetyp einen Browser gibt, egal ob Android oder Kindle, öffnet dieser Code diesen Browser. Was ist das Problem damit? Offensichtlich sollte die damit verbundene Aufgabe intenterfüllt werden.
Maveň ツ
1
@ ddor254 das ist kein javascript. Laut Sound haben Sie einen Link auf einer Webseite und möchten erzwingen, dass dieser in Chrome geöffnet wird, auch wenn der Benutzer die Webseite in einem anderen Browser anzeigt. Das ist nicht möglich.
Martin
49

Es gibt zwei Lösungen.

Per Paket

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

Nach Schema

    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
    }

WARNUNG! Die folgende Technik funktioniert nicht auf den neuesten Versionen von Android. Es dient als Referenz, da es diese Lösung schon seit einiger Zeit gibt:

    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
    }
philippe_b
quelle
phillippe_b, danke für den code. Irgendwelche Vorschläge, wo dieser Code platziert werden soll? Ein Teil der Syntax ist mir unbekannt. Soll dies in eine Sonnenfinsternis versetzt werden?
user1607943
Dies ist Java-Code, der in einer nativen Android-Anwendung angezeigt werden soll. Diese Anwendung kann ausschließlich Chrome starten. Obwohl dies sehr einfach ist, gebe ich zu, dass es etwas langweilig ist, wenn Sie absolut nichts über Android-Apps wissen: wie man sie codiert, wie man sie bereitstellt ...
philippe_b
Hallo, danke für diesen Code. Ist es möglich, Chrome mit bestimmten Optionen zu starten? ZB möchte ich es im Vollbildmodus starten?
user826955
2
try{}Stellen Sie sicher, dass Sie das mit einem - Ich habe gerade auf einem Telefon getestet, auf dem kein Chrom installiert war und die explizite Absicht die App zum Absturz brachte
Jemand irgendwo
1
Dadurch wird Chrom auch dann nicht geöffnet, wenn Chrom installiert ist. es geht immer zu fangen
Alireza A. Ahmadi
8

Alle vorgeschlagenen Lösungen funktionieren bei mir nicht mehr. Dank @pixelbandito hat er mich in die richtige Richtung gelenkt. Ich habe die nächste Konstante in den Chromquellen gefunden

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

Und die nächste Verwendung:

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

Die Lösung lautet also (beachten Sie, dass die URL nicht codiert werden sollte).

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);
    }
}
Eugene Popovich
quelle
8

Dies funktioniert in Firefox und Opera

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

Tim Smith
quelle
3

Hier ist die nächste , die ich gefunden habe: Schreiben einer URL und ersetzt httpmitgooglechrome öffnet Chrome, aber es scheint nicht spezifiziert die URL zu öffnen. Ich arbeite mit einem Samsung Galaxy S5, Android 5.0

Das ist das Beste, was ich gefunden habe - für jede andere Lösung, die ich auf SO gesehen habe, ist eine Android-App erforderlich, keine Webapp.

Pixelbandito
quelle
1
Danke für die richtige Richtung. Siehe meine Antwort basierend auf Ihrem gefundenen stackoverflow.com/a/34491791/527759
Eugene Popovich
3

Die verschiedenen Antworten oben sind gut, aber keine ist vollständig. Das alles passte mir am besten, was:

Versuchen Sie, den Chrome-Webbrowser zu öffnen. Falls eine Ausnahme auftritt (Chrome ist nicht standardmäßig oder nicht installiert), werden Sie aufgefordert, den Browser vom Benutzer auszuwählen:

String uriString = "your uri string";

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"));
}
Tushar Seth
quelle
1
Wenn Sie eine Fehlermeldung zur TAG-Konstante erhalten, fügen Sie diesen Code zur Aktivität hinzu. private static final String TAG = "MainActivity";
Lieblingsvideos
2

Nach der Antwort von @ philippe_b möchte ich hinzufügen, dass dieser Code nicht funktioniert, wenn Chrome nicht installiert ist. Es gibt noch einen weiteren Fall, in dem es nicht funktioniert - dies ist der Fall, wenn Chrome NICHT als Standardbrowser ausgewählt ist (aber installiert ist) ODER auch wenn kein Browser als Standardbrowser ausgewählt ist.

Fügen Sie in solchen Fällen auch den folgenden catch-Teil des Codes hinzu.

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

user1406716
quelle
2

Hier ist ein allgemeinerer Ansatz: Er ermittelt zuerst den Paketnamen für den Standardbrowser, der "http: //" - URLs verarbeitet, und verwendet dann den in den anderen Antworten genannten Ansatz, um die URL in einem Browser explizit zu öffnen:

    public void openUrlInBrowser(Context context, String url) {
        // Find out package name of default browser
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://"));
        ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);
        String packageName = resolveInfo.activityInfo.packageName;

        // Use the explicit browser package name
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        i.setPackage(packageName);
        context.startActivity(i);
    }
Yaron Budowski
quelle
1

Android öffnet einen Link in Chrome mit Java:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("your url link"));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setPackage("com.android.chrome");
try {
    context.startActivity(i);
} catch (ActivityNotFoundException e) {
 Toast.makeText(context, "unable to open chrome", Toast.LENGTH_SHORT).show();
 i.setPackage(null);
 context.startActivity(i);
}

Android öffnet einen Link in Chrome mit Kotlin:

val i = Intent(Intent.ACTION_VIEW, Uri.parse("https://stackoverflow.com/"))
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
i.setPackage("com.android.chrome")
try {
  context!!.startActivity(i)
} catch (e: ActivityNotFoundException) {
  Toast.makeText(context, "unable to open chrome", Toast.LENGTH_SHORT).show()
  i.setPackage(null)
  context!!.startActivity(i)
}
Aftab Alam
quelle
0

In Google Play gibt es eine Vielzahl von Chrome-Browser-Apps mit unterschiedlichen Funktionen

Es ist also richtig, alle zu überprüfen

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()
    }
}
Vlad
quelle