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

416

Czy ktoś może poprowadzić mnie, jak uruchomić moją aplikację na Androida z przeglądarki na Androida?

Parimal Modi
źródło

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.

Felix
źródło
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

AndroidGecko
źródło
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.

hackbod
źródło
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>
Zaki
źródło
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ę .

Denshov
źródło
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.

georgij
źródło
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
8

Poniższy link zawiera informacje na temat uruchamiania aplikacji (jeśli jest zainstalowana) bezpośrednio z przeglądarki. W przeciwnym razie bezpośrednio otwiera aplikację w sklepie Play, dzięki czemu użytkownik może bezproblemowo pobrać.

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

Varun Bhatia
źródło
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>
Zoltan
źródło
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".

Mehdi Dehghani
źródło
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 {
   ...
}
chrześcijanin
źródło
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. :)

Parimal Modi
źródło
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ć.

Paul Lindner
źródło
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 
}
T.Todua
źródło
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.

S. Koshelnyk
źródło
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>
Vicky Salunkhe
źródło