webentwicklung-frage-antwort-db.com.de

Starten Sie die benutzerdefinierte Android Anwendung über den Android Browser

Kann mir jemand eine Anleitung geben, wie ich meine Anwendung Android über den Browser Android starten kann?

401
Parimal Modi

Verwenden Sie ein <intent-filter> mit einem <data> -Element. Um beispielsweise alle Links zu Twitter.com zu bearbeiten, fügen Sie dies in Ihren _<activity>_ in Ihren _AndroidManifest.xml_ ein:

_<intent-filter>
    <data Android:scheme="http" Android:Host="Twitter.com"/>
    <action Android:name="Android.intent.action.VIEW" />
</intent-filter>
_

Wenn der Benutzer dann im Browser auf einen Link zu Twitter klickt, wird er gefragt, welche Anwendung er verwenden soll, um die Aktion abzuschließen: den Browser oder Ihre Anwendung.

Wenn Sie eine enge Integration zwischen Ihrer Website und Ihrer App sicherstellen möchten, können Sie natürlich Ihr eigenes Schema definieren:

_<intent-filter>
    <data Android:scheme="my.special.scheme" />
    <action Android:name="Android.intent.action.VIEW" />
</intent-filter>
_

Dann können Sie in Ihre Web-App Links einfügen wie:

_<a href="my.special.scheme://other/parameters/here">
_

Und wenn der Benutzer darauf klickt, wird Ihre App automatisch gestartet (da es wahrscheinlich die einzige ist, die mit _my.special.scheme://_ uris-Typen umgehen kann). Der einzige Nachteil dabei ist, dass der Benutzer einen bösen Fehler erhält, wenn er die App nicht installiert hat. Und ich bin nicht sicher, ob es eine Möglichkeit gibt, das zu überprüfen.


Bearbeiten: Um Ihre Frage zu beantworten, können Sie getIntent().getData() verwenden, das ein Uri -Objekt zurückgibt. Anschließend können Sie mit den Methoden _Uri.*_ die benötigten Daten extrahieren. Angenommen, der Benutzer hat auf einen Link zu _http://Twitter.com/status/1234_ geklickt:

_Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String Host = data.getHost(); // "Twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"
_

Sie können dies überall in Ihrem Activity tun, aber Sie werden es wahrscheinlich in onCreate() tun wollen. Sie können auch params.size() verwenden, um die Anzahl der Pfadsegmente in Uri abzurufen. Weitere Uri-Methoden, mit denen Sie bestimmte Teile extrahieren können, finden Sie in javadoc oder auf der Entwickler-Website Android.

603
Felix

Alle obigen Antworten haben bei mir mit CHROME zum 28. Januar 2014 nicht funktioniert

meine App wurde ordnungsgemäß über http://example.com/someresource/ Links von Apps wie Hangouts, Google Mail usw. gestartet, jedoch nicht über den Browser chrome.

um dieses Problem zu lösen, damit es ordnungsgemäß von CHROME aus gestartet wird, müssen Sie den Intent-Filter wie folgt einstellen

        <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />

            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />

            <data
                Android:Host="example.com"
                Android:pathPrefix="/someresource/"
                Android:scheme="http" />
            <data
                Android:Host="www.example.com"
                Android:pathPrefix="/someresource/"
                Android:scheme="http" />
        </intent-filter>

beachten Sie das pathPrefix -Element

ihre App wird nun in der Aktivitätsauswahl angezeigt, wenn der Benutzer ein http://example.com/someresource/ Muster vom chrome Browser anfordert, indem er auf einen Link aus den Google-Suchergebnissen oder einer anderen Website klickt

68
AndroidGecko

Bitte beachten Sie meinen Kommentar hier: Link im Browser Android erstellen, um meine App zu starten?

Wir raten Menschen dringend davon ab, ihre eigenen Systeme zu verwenden, es sei denn, sie definieren ein neues weltweites Internet-System.

66
hackbod

In meinem Fall musste ich zwei Kategorien für den <intent-filter> festlegen und dann funktionierte es:

<intent-filter>
<data Android:scheme="my.special.scheme" />
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT"/>
<category Android:name="Android.intent.category.BROWSABLE"/>
</intent-filter>
48
Zaki

Zum Beispiel haben Sie folgende Dinge:

Ein Link zum Öffnen Ihrer App: http://example.com

Der Paketname Ihrer App: com.example.mypackage

Dann müssen Sie als nächstes tun:

1) Fügen Sie Ihrer Aktivität einen Absichtsfilter hinzu (Dies kann jede gewünschte Aktivität sein. Weitere Informationen finden Sie in der Dokumentation ).

        <activity
        Android:name=".MainActivity">

        <intent-filter Android:label="@string/filter_title_view_app_from_web">
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />
            <!-- Accepts URIs that begin with "http://example.com" -->

            <data
                Android:Host="example.com"
                Android:scheme="http" />
        </intent-filter>

        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity> 

2) Erstellen Sie eine HTML-Datei, um den Link zu testen, oder verwenden Sie diese Methode

<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a>

<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a>

3) Verwenden Sie Mobile Chrome zum Testen

4) Das war's.

Und es ist nicht notwendig, App im Markt zu veröffentlichen, um Deep-Linking zu testen =)

Weitere Informationen finden Sie unter Dokumentation und nützlich Präsentation .

Es sollte auch <category Android:name="Android.intent.category.BROWSABLE"/> zum Intent-Filter hinzugefügt werden, damit die Aktivität über den Link richtig erkannt wird.

18
georgij

Über den folgenden Link erhalten Sie Informationen zum Starten der App (falls installiert) direkt über den Browser. Andernfalls wird die App direkt im Play Store geöffnet, sodass der Benutzer sie nahtlos herunterladen kann.

https://developer.chrome.com/multidevice/Android/intents

8
Varun Bhatia

Beachten Sie, dass Sie den Intent-Filter aufteilen müssen, wenn Ihr Symbol beim Implementieren dieser Funktion aus dem Launcher von Android verschwindet.

    <activity
        Android:name=".MainActivity"
        Android:label="@string/app_name" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />
            <data Android:scheme="your-own-uri" />
        </intent-filter>
    </activity>
7
Zoltan

Ja, Chrome sucht, anstatt nach Schema zu suchen. Wenn Sie Ihre App über das URI-Schema starten möchten, verwenden Sie dieses coole Dienstprogramm im Play Store. Es hat meinen Tag gerettet :) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender

6
RRK

Xamarin Portierung der Antwort von Felix

Fügen Sie in Ihrem MainActivity Folgendes hinzu ( docs: Android.App.IntentFilterAttribute Class):

....
[IntentFilter(new[] { 
    Intent.ActionView }, 
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, 
    DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
    ....

Xamarin fügt im AndroidManifest.xml Folgendes für Sie hinzu:

<activity Android:label="Something" Android:screenOrientation="portrait" Android:theme="@style/MyTheme" Android:name="blahblahblah.MainActivity">
  <intent-filter>
    <action Android:name="Android.intent.action.VIEW" />
    <category Android:name="Android.intent.category.DEFAULT" />
    <category Android:name="Android.intent.category.BROWSABLE" />
    <data Android:scheme="my.special.scheme" />
  </intent-filter>
</activity>

Und um params ( zu erhalten, habe ich in OnCreate von MainActivity getestet:

var data = Intent.Data;
if (data != null)
{
    var scheme = data.Scheme;
    var Host = data.Host;
    var args = data.PathSegments;

    if (args.Count > 0)
    {
        var first = args[0];
        var second = args[1];
        ...
    }
}

Soweit ich weiß, kann oben in jeder Aktivität hinzugefügt werden, nicht nur in MainActivity

Anmerkungen:

  1. Wenn der Benutzer auf den Link klickt, startet das Betriebssystem Android Ihre App neu (ggf. vorherige Instanz beenden und neue ausführen) , bedeutet dies, dass OnCreate Event der App MainLauncher Activity wird erneut ausgelöst.
  2. Mit diesem Link: <a href="my.special.scheme://Host/arg1/arg2">, in den obigen letzten Code-Snippet-Werten ist:
scheme: my.special.scheme
Host: Host
args: ["arg1", "arg2"]
first: arg1
second: arg2
5
Mehdi Dehghani

Felix 'Ansatz zum Umgang mit Deep Links ist der typische Ansatz zum Umgang mit Deep Links. Ich würde auch vorschlagen, diese Bibliothek zu überprüfen, um das Routing und Parsen Ihrer Deep Links zu handhaben:

https://github.com/airbnb/DeepLinkDispatch

Sie können Anmerkungen verwenden, um Ihre Aktivität für eine bestimmte Deep-Link-URI zu registrieren, und sie extrahiert die Parameter für Sie, ohne die üblichen Schritte zum Abrufen der Pfadsegmente, zum Abgleichen usw. ausführen zu müssen. Sie können einfach Anmerkungen und Aktivitäten wie diese erstellen :

@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
   ...
}
3
Christian

Hey, ich habe die Lösung. Ich habe die Kategorie nicht als "Standard" festgelegt. Außerdem habe ich die Hauptaktivität für die Absichtsdaten verwendet. Jetzt benutze ich eine andere Aktivität für die Intent-Daten. Danke für die Hilfe. :)

0
Parimal Modi

Sie müssen der CALLBACK_URL 'app: //' einen Pseudo-Hostnamen hinzufügen, der als URL keinen Sinn ergibt und nicht analysiert werden kann.

0
Paul Lindner

example.php:

<?php
if(!isset($_GET['app_link'])){  ?>   
    <iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <?php 
}
else { ?>
    <script type="text/javascript">
    self.window.location        = '<?php echo $_GET['app_link'];?>';
    window.parent.location.href = '<?php echo $_GET['full_link'];?>';
    </script>
<?php 
}
0
T.Todua

Schau @JRuns Antwort in hier . Die Idee ist, HTML mit Ihrem benutzerdefinierten Schema zu erstellen und es irgendwo hochzuladen. Wenn Sie dann auf Ihren benutzerdefinierten Link in Ihrer HTML-Datei klicken, werden Sie zu Ihrer App weitergeleitet. Ich habe this article für Android verwendet. Vergessen Sie jedoch nicht, der Zielaktivität den vollständigen Namen Name = "MyApp.Mobile.Droid.MainActivity" zuzuweisen.

0
S. Koshelnyk

Stand 15/06/2019

was ich getan habe, ist alle vier Möglichkeiten zum Öffnen der URL einzuschließen.

mit http/https und 2 mit www im Präfix und 2 ohne www

und wenn ich dies benutze, wird meine App jetzt automatisch gestartet, ohne dass ich einen Browser und eine andere Option auswählen muss.

<intent-filter Android:autoVerify="true">
    <action Android:name="Android.intent.action.VIEW" />
    <category Android:name="Android.intent.category.DEFAULT" />
    <category Android:name="Android.intent.category.BROWSABLE" />

    <data Android:scheme="https" Android:Host="example.in" />
    <data Android:scheme="https" Android:Host="www.example.in" />
    <data Android:scheme="http" Android:Host="example.in" />
    <data Android:scheme="http" Android:Host="www.example.in" />

</intent-filter>
0
Vicky Salunkhe