Uruchom niestandardową aplikację na Androida w przeglądarce Androida


Odpowiedzi:


616

Użyj <intent-filter>z <data>elementem. Na przykład, aby obsłużyć wszystkie linki do twitter.com, umieściłbyś to <activity>w swoim AndroidManifest.xml:

<intent-filter>
    <data android:scheme="http" android:host="twitter.com"/>
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

Następnie, gdy użytkownik kliknie link do Twittera w przeglądarce, zostanie zapytany, jakiej aplikacji użyć, aby zakończyć akcję: przeglądarki lub aplikacji.

Oczywiście, jeśli chcesz zapewnić ścisłą integrację między witryną a aplikacją, możesz zdefiniować własny schemat:

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

Następnie w aplikacji internetowej możesz umieścić linki takie jak:

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

A kiedy użytkownik ją kliknie, aplikacja zostanie uruchomiona automatycznie (ponieważ prawdopodobnie będzie to jedyna, która może obsłużyć my.special.scheme://typ uris). Jedynym minusem jest to, że jeśli użytkownik nie ma zainstalowanej aplikacji, otrzyma nieprzyjemny błąd. Nie jestem pewien, czy można to sprawdzić.


Edycja: Aby odpowiedzieć na twoje pytanie, możesz użyć, getIntent().getData()który zwraca Uriobiekt. Następnie możesz użyć Uri.*metod do wyodrębnienia potrzebnych danych. Załóżmy na przykład, że użytkownik kliknął link do http://twitter.com/status/1234:

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"

Możesz zrobić powyższe w dowolnym miejscu Activity, ale prawdopodobnie będziesz chciał to zrobić onCreate(). Możesz także użyć, params.size()aby uzyskać liczbę segmentów ścieżki w Uri. Zajrzyj na stronę javadoc lub witrynę programisty Androida, aby uzyskać inne Urimetody wyodrębnienia określonych części.


6
Wielkie dzięki za szybką odpowiedź. Ale czy możesz mi powiedzieć, jak uzyskać dostęp do parametrów po „my.special.scheme: //”.
Parimal Modi

4
Zredagowałem swoją odpowiedź, aby zawierała instrukcje, jak wyodrębnić dane z Uri. Zaznacz tę odpowiedź jako zaakceptowaną (tylko), jeśli uważasz, że tak, klikając znacznik wyboru obok niej.
Felix

9
co jeśli docelowa aplikacja na Androida nie jest zainstalowana? Jak sobie z tym poradzić.
Nemo,

13
Każdy, kto, podobnie jak ja, nie jest w stanie uruchomić tego schematu, musi dodać android:exported="true"do swojego Activitymanifestu. Sprawdź tę odpowiedź stackoverflow.com/a/13044911/1276636
Sufian

4
Nie jestem pewien, jak to działa dla całego świata. Po prostu nie działa na Chrome i zawsze otwiera link w przeglądarce, dopóki nie umieścisz elementu „android: pathPrefix”. W każdym razie odpowiedź nie ma wartości kategorii wymienionych w dokumentacji. Jeśli nadal nie działa dla kogoś, zapoznaj się z tym: stackoverflow.com/a/21727055/2695276 PS: walczyłem o to przez kilka dni.
Rajat Sharma

70

Wszystkie powyższe odpowiedzi nie działały dla mnie CHROMEna dzień 28 stycznia 2014 r

moja aplikacja została uruchomiona poprawnie z http://example.com/someresource/ linków z aplikacji takich jak hangouty, Gmail itp., ale nie z przeglądarki Chrome.

aby rozwiązać ten problem, aby poprawnie uruchamiał się z CHROME, musisz ustawić taki filtr intencji

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

zanotuj pathPrefixelement

Twoja aplikacja będzie teraz pojawiać się w narzędziu wyboru aktywności za każdym razem, gdy użytkownik zażąda http://example.com/someresource/ wzorca z przeglądarki Chrome, klikając link w wynikach wyszukiwania Google lub w dowolnej innej witrynie


To bardzo mi pomogło. Wielkie dzięki! Proszę zamieścić tutaj swoją odpowiedź, abym mógł przyznać nagrodę! stackoverflow.com/questions/21663001/…
Vlad Schnakovszki

Jaki to język?
Przerywa

Cześć, wiem, że jest za stary. Uderza mnie również ten sam scenariusz. Podałem pathPrefix, schemat i host, ale nie działa. Próbowałem tylko ze schematem, a potem zadziałało. Ale kiedy dodałem hosta, przestał działać. Masz pojęcie, co może być problemem?
wydają się

Spędziłem nad tym kilka dni, aż doszedłem do tej odpowiedzi. Nie jestem pewien, jak to działało dla całego świata bez elementu pathPrefix. Nigdy nie pracował dla mnie na Chrome, mimo że robiłem wszystko zgodnie z dokumentacją. Dziękuję bardzo.
Rajat Sharma

66

Proszę zobaczyć mój komentarz tutaj: zrobić link w przeglądarce Androida, aby uruchomić moją aplikację?

Zdecydowanie odradzamy ludziom korzystanie z ich własnych programów, chyba że definiują oni nowy program na całym świecie.


10
Hackbod jest jednym z inżynierów Google odpowiedzialnych za platformę Android. Prawdopodobnie dobrym pomysłem jest skorzystanie z tej porady. W rzeczywistości wygląda na to, że taka niestandardowa obsługa schematu uległa awarii w strukturze plastra miodu.
nmr

23
Nie mogę ponosić odpowiedzialności za ograniczenia nałożone na programistów przez iOS. ;)
hackbod

12
pociągnięty do odpowiedzialności? Nie. Ale możesz wziąć to pod uwagę, ponieważ bez względu na to, czy ci się to podoba, czy nie, ograniczenia te są nałożone na wielu twoich programistów
ByteMe

6
hackbod odpowiada na pytanie specjalnie dla Androida. Nie ma wzmianki o iOS, więc nie trzeba go brać pod uwagę.
nilskp

4
@hackbod czy stosowanie schematu nazw (np. href = "com.ourdomain.myapp // cokolwiek") jest dobrą praktyką, zakładając, że taki link można znaleźć na różnych stronach internetowych?
Julien Bérubé

48

W moim przypadku musiałem ustawić dwie kategorie dla <intent-filter>i wtedy zadziałało:

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

2
To samo tutaj, potrzebne, aby dodać dodatkową kategorię.
KPK

Czy ktoś może wyjaśnić, jaki jest faktyczny proces wykonania tego? Pomocny będzie każdy link do dokładnej implementacji, warunków wstępnych. Dzięki
Ankit Garg

Testowane na konfiguracji dewelopera. Właściwie podałem niewłaściwą nazwę domeny. Mój błąd.
Ankit Garg

Najwyżej oceniana odpowiedź nie działała dla mnie, ale tak się stało. Dziękuję Ci.
EL45

25

Na przykład masz następujące rzeczy:

Link do otwarcia aplikacji: http://example.com

Nazwa pakietu aplikacji: com.example.mypackage

Następnie musisz wykonać następujące czynności:

1) Dodaj filtr zamiarów do swojej aktywności (może to być dowolna aktywność. Aby uzyskać więcej informacji, zapoznaj się z dokumentacją ).

        <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) Utwórz plik HTML, aby przetestować łącze lub użyj tych metod.

<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) Użyj Mobile Chrome do przetestowania

4) To wszystko.

I nie jest konieczne publikowanie aplikacji na rynku w celu przetestowania precyzyjnego linkowania =)

Aby uzyskać więcej informacji, sprawdź dokumentację i przydatną prezentację .


Musiałem utworzyć plik HTML i załadować go, aby go uruchomić. Zastanawiam się, dlaczego szczególnie ta druga nie działa bezpośrednio z przeglądarki (chrome).
Makalele,

18

Należy również <category android:name="android.intent.category.BROWSABLE"/>dodać do filtru zamiarów, aby aktywność została poprawnie rozpoznana z linku.


4
Dla porównania, dodanie CATEGORY_BROWSABLE oznacza, że ​​„Działanie docelowe można bezpiecznie wywołać w przeglądarce, aby wyświetlić dane, do których odwołuje się łącze - na przykład obraz lub wiadomość e-mail”.
greg7gkb

Czy to istniejąca kategoria, czy proponujesz nową?
Anish

Istnieje. Najwyraźniej powinieneś mieć osobnego hosta strony w różnych tagach filtrowania intencji, bo to powoduje problemy.
NoBugs,

2
Nie tylko PRZEGLĄDANE, ale także android.intent.category.DEFAULT - dzięki czemu link może zostać otwarty, gdy zostanie zainicjowany w innych aplikacjach, takich jak e-mail (nie tylko przeglądarki)
AlikElzin-kilaka 30.12.2013


7

Pamiętaj, że jeśli Twoja ikona zniknie z programu uruchamiającego Androida po wdrożeniu tej funkcji, musisz podzielić filtr celowy.

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


5

Xamarin port Felix „s odpowiedź

W swoim MainActivitydodaj to ( docs: Android.App.IntentFilterAttribute Class ):

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

Xamarin doda AndroidManifest.xmldla Ciebie następujące elementy:

<activity
    android:label="Something"
    android:screenOrientation="portrait"
    android:theme="@style/MyTheme"
    android:name="blah.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>

Aby uzyskać parametry ( testowałem w OnCreate of MainActivity ):

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

O ile mi wiadomo, powyższe można dodać w dowolnej aktywności, nie tylko MainActivity

Uwagi:

  1. Gdy użytkownik kliknie łącze, system operacyjny Android ponownie uruchomi aplikację (zabij poprzednią instancję, jeśli istnieje i uruchom nową) , co oznacza, że OnCreatezdarzenie aplikacji MainLauncher Activityzostanie ponownie uruchomione .
  2. Z tym linkiem: <a href="my.special.scheme://host/arg1/arg2">w powyższym ostatnim kodzie wartości fragmentu będą następujące:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

Aktualizacja: jeśli Android utworzy nową instancję Twojej aplikacji, również powinieneś ją dodać android:launchMode="singleTask".


3

Podejście Felixa do obsługi głębokich linków jest typowym podejściem do obsługi głębokich linków. Sugerowałbym również sprawdzenie tej biblioteki, aby obsłużyć routing i parsowanie twoich głębokich linków:

https://github.com/airbnb/DeepLinkDispatch

Możesz użyć adnotacji, aby zarejestrować swoją aktywność dla konkretnego identyfikatora URI z głębokim linkiem, a ona wyodrębni parametry, bez konieczności wykonywania zwykłej procedury uzyskiwania segmentów ścieżki, dopasowywania go itp. Możesz po prostu adnotować i aktywność w ten sposób :

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

0

Hej, mam rozwiązanie. Nie ustawiłem kategorii jako „Domyślna”. Używałem również aktywności Main dla zamiaru Dane. Teraz używam innej aktywności dla danych zamiaru. Dzięki za pomoc. :)


Brzmi mało prawdopodobne (chociaż zdaję sobie sprawę, że jest to stare pytanie i być może coś się zmieniło.) Od developer.android.com/guide/components/intents-filters.html#ifs "Aby przejść test kategorii, każda kategoria w obiekt Intent musi pasować do kategorii w filtrze . Filtr może wyświetlać dodatkowe kategorie, ale nie może pominąć żadnej z nich. ”
Noach Magedman,

0

Musisz dodać pseudo-nazwę hosta do aplikacji CALLBACK_URL „//: //” nie ma sensu jako adres URL i nie można go przeanalizować.


0

przyklad.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 
}

1
Tworzy to dwa niewidoczne elementy iframe: precyzyjny i normalny. Jeśli aplikacja jest zainstalowana, precyzyjny link iframe ją uruchomi. Jeśli nie, wyświetla się normalny link. Przy dodatkowej pracy można wdrożyć odraczanie precyzyjnego linkowania w miejscu, gdzie wywoływany jest precyzyjny link po zainstalowaniu aplikacji.
Dominic Cerisano,

0

@JRuns Look odpowiedzieć tutaj . Chodzi o to, aby utworzyć HTML z niestandardowym schematem i przesłać go gdzieś. Następnie, jeśli klikniesz niestandardowy link w pliku HTML, nastąpi przekierowanie do Twojej aplikacji. Użyłem tego artykułu dla Androida. Ale nie zapomnij ustawić Name = "MyApp.Mobile.Droid.MainActivity"atrybutu pełnej nazwy dla swojej docelowej aktywności.


0

Na dzień 15.06.2019

to, co zrobiłem, obejmuje wszystkie cztery możliwości otwarcia adresu URL.

tzn. z http/ httpsi 2 z wwwprefiksem i 2 bezwww

i dzięki temu moja aplikacja uruchamia się teraz automatycznie, bez pytania o wybranie przeglądarki i innej opcji.

<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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.