Czy ktoś może poprowadzić mnie, jak uruchomić moją aplikację na Androida z przeglądarki na Androida?
Czy ktoś może poprowadzić mnie, jak uruchomić moją aplikację na Androida z przeglądarki na Androida?
Odpowiedzi:
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 Uri
obiekt. 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 Uri
metody wyodrębnienia określonych części.
android:exported="true"
do swojego Activity
manifestu. Sprawdź tę odpowiedź stackoverflow.com/a/13044911/1276636
Wszystkie powyższe odpowiedzi nie działały dla mnie CHROME
na 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 pathPrefix
element
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
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.
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>
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ę .
Należy również <category android:name="android.intent.category.BROWSABLE"/>
dodać do filtru zamiarów, aby aktywność została poprawnie rozpoznana z linku.
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ć.
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>
Tak, Chrome wyszukuje zamiast szukać schematu. Jeśli chcesz uruchomić aplikację za pomocą schematu URI, skorzystaj z tej fajnej aplikacji narzędziowej w sklepie Play. Uratowało mi to dzień :) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender
Xamarin port Felix „s odpowiedź
W swoim MainActivity
dodaj 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.xml
dla 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:
OnCreate
zdarzenie aplikacji MainLauncher Activity
zostanie ponownie uruchomione .<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"
.
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 {
...
}
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. :)
Musisz dodać pseudo-nazwę hosta do aplikacji CALLBACK_URL „//: //” nie ma sensu jako adres URL i nie można go przeanalizować.
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
}
@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.
Na dzień 15.06.2019
to, co zrobiłem, obejmuje wszystkie cztery możliwości otwarcia adresu URL.
tzn. z http
/ https
i 2 z www
prefiksem 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>