Dodać link w przeglądarce Android uruchomić moją aplikację?

Czy możliwe jest wykonanie linku takiego jak:

<a href="anton://useful_info_for_anton_app">click me!</a>

Ponieważ moja aplikacja Anton się uruchamia?

Wiem, że działa to dla aplikacji Android Market z protokołem market, ale czy można coś podobnego zrobić z innymi aplikacjami?

Oto przykład linku, który uruchomi Android Market:]}
<a href="market://search?q=pname:com.nytimes.android">click me!</a>

Aktualizacja: Odpowiedź, którą zaakceptowałem udzielona przez eldarerathis działa świetnie, ale chcę tylko wspomnieć, że miałem pewne problemy z kolejnością podelementów z tagiem <intent-filter>. Proponuję po prostu zrobić kolejny <intent-filter> z nowymi podelementami w tym tagu, aby uniknąć problemów, które miałem. Na przykład mój AndroidManifest.xml wygląda tak:

<activity android:name=".AntonWorld"
          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>
        <data android:scheme="anton" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
 200
Author: Anton, 2010-08-12

8 answers

Myślę, że będziesz chciał spojrzeć na <intent-filter> element Twojego pliku Mainfest. W szczególności zapoznaj się z dokumentacją dla <data> element podrzędny.

Zasadniczo, to co musisz zrobić, to zdefiniować swój własny schemat. Coś w stylu:

<intent-filter>
    <data android:scheme="anton" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
    ...
</intent-filter>

Wtedy powinieneś być w stanie uruchomić swoją aplikację z linkami zaczynającymi się od schematu URI anton:.

 90
Author: eldarerathis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-12 16:44:22

Proszę nie używać własnego schematu tak!!! Schematy URI są przestrzenią nazw sieci globalną . Czy jesteś właścicielem programu" anton: "na całym świecie? Nie? Więc go nie używaj.

Jedną z opcji jest posiadanie strony internetowej i posiadanie filtra intencyjnego dla określonego URI na tej stronie. Na przykład Market robi to, aby przechwycić Uri na swojej stronie internetowej: {]}

        <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="http" android:host="market.android.com"
                android:path="/search" />
        </intent-filter>

Alternatywnie istnieje schemat " intent:". Pozwala to opisać prawie każdą intencję jako URI, która po kliknięciu przeglądarka spróbuje się uruchomić. Aby zbudować taki schemat, najlepiej jest po prostu napisać kod, aby skonstruować intencję, którą chcesz uruchomić, a następnie wydrukować wynik intencji.toUri (Węg.URI_INTENT_SCHEME).

Możesz użyć akcji z tą intencją, aby znaleźć działanie wspierające tę akcję. Przeglądarka automatycznie doda PRZEGLĄDALNĄ kategorię do intencji przed jej uruchomieniem, ze względów bezpieczeństwa; usunie również wszelkie jawne komponenty, które dostarczyłeś z tego samego powodu.

Najlepszym sposobem, aby tego użyć, jeśli chcesz mieć pewność, że uruchomi się tylko Twoja aplikacja, jest użycie własnej akcji o zasięgu i użycie intencji.setPackage (), aby powiedzieć, że intencja będzie pasować tylko do pakietu aplikacji.

Kompromisy między tymi dwoma:

  • Adresy URL Http wymagają posiadania własnej domeny. Użytkownik zawsze otrzyma opcję wyświetlania URI w przeglądarce. Ma bardzo ładne właściwości awaryjne, gdzie jeśli aplikacja nie jest zainstalowana, po prostu wylądują na Twoja strona www.

  • Intent Uri wymaga, aby aplikacja była już zainstalowana i tylko na telefonach z Androidem. Zezwalaj prawie na dowolne intencje (ale zawsze uwzględniaj kategorię BROWSABLE i nie wspieraj jawnych komponentów). Pozwalają one kierować uruchomienie tylko do aplikacji bez użytkownik ma możliwość zamiast przejść do przeglądarki lub innej aplikacji.

 263
Author: hackbod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-12 21:32:24

Przepraszam za promowanie siebie, ale mam wtyczkę jQuery do uruchamiania natywnych aplikacji z linków www https://github.com/eusonlito/jquery.applink

Możesz używać go łatwo:

<script>
$('a[data-applink]').applink();
</script>

<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>
 13
Author: Lito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 18:11:47

Ja również stanąłem przed tym problemem i widzę wiele absurdalnych stron. Nauczyłem się, że aby Twoja aplikacja była przeglądalna, Zmień kolejność elementów XML, to jest to:

<activity
    android:name="com.example.MianActivityName"
    android:label="@string/title_activity_launcher">

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

    <intent-filter>                
        <data android:scheme="http" />     
        <!-- or you can use deep linking like  -->               

        <data android:scheme="http" android:host="xyz.abc.com"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>

    </intent-filter>
</activity>
To zadziałało na mnie i może Ci pomóc.
 12
Author: ashwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 04:08:02

Oto mój przepis:

Utwórz statyczny HTML, który przekieruje do żądanego adresu URL aplikacji, umieść tę stronę w Internecie.

W ten sposób linki, które udostępniasz, są "prawdziwymi" linkami dla Androida (będą "klikalne").

"udostępniasz" zwykły link HTTP, www.your.server.com/foo/bar.html Ten adres URL zwraca prosty 8-liniowy HTML, który przekierowuje do URI aplikacji (okno.location = "bla: / / kuku") (zauważ, że 'bla' nie musi być http ani HTTPS więcej).

Gdy już to uruchomisz, możesz rozszerzyć HTML o wszystkie fantazyjne możliwości, jak sugerowano powyżej.

Działa z wbudowaną przeglądarką, Operą i Firefoksem(nie testowałem żadnej innej przeglądarki). Firefox pyta " ten link musi być otwarty za pomocą aplikacji "(ok, ANULUJ). Inne przeglądarki najwyraźniej nie martwią się o bezpieczeństwo, po prostu otwierają aplikację, bez zadawania pytań.

 5
Author: JRun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-07 11:20:27

Po skonfigurowaniu intencyjnego i niestandardowego schematu url dla Twojej aplikacji, ten kod javascript u góry strony odbierającej działa dla mnie zarówno na iOS, jak i Android: {]}

<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
    navigator.userAgent.match(/android/i)) {
  var store_loc = "itms://itunes.com/apps/raditaz";
  var href = "/iphone/";
  var is_android = false;
  if (navigator.userAgent.match(/android/i)) {
    store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
    href = "/android/";
    is_android = true;
  }
  if (location.hash) {
    var app_loc = "raditaz://" + location.hash.substring(2);
    if (is_android) {
      var w = null;
      try {
        w = window.open(app_loc, '_blank');
      } catch (e) {
        // no exception
      }
      if (w) { window.close(); }
      else { window.location = store_loc; }
    } else {
      var loadDateTime = new Date();
      window.setTimeout(function() {
        var timeOutDateTime = new Date();
        if (timeOutDateTime - loadDateTime < 5000) {
          window.location = store_loc;
        } else { window.close(); }
      },
      25);
      window.location = app_loc;
    }
  } else {
    location.href = href;
  }
}
</script>

To zostało przetestowane tylko na przeglądarce Android. Nie jestem pewien co do Firefoksa czy opery. Kluczem jest to, że nawet jeśli przeglądarka Android nie rzuci miłego wyjątku dla ciebie na window.open(custom_url, '_blank'), zawiedzie i zwróci null, które możesz przetestować później.

Aktualizacja: używając store_loc = "https://play.google.com/store/apps/details?id=com.raditaz"; do linku do Google Play na Androida.

 4
Author: Pete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-14 00:03:24

Możesz rozważyć bibliotekę do obsługi głębokiego łącza do Twojej aplikacji:

Https://github.com/airbnb/DeepLinkDispatch

Możesz dodać filtr intencji do aktywności z adnotacjami, jak sugerowano powyżej. Zajmie się routingiem i analizowaniem parametrów dla wszystkich Twoich głębokich łączy. Na przykład Twoja główna aktywność może mieć coś takiego:

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

Może również obsługiwać parametry zapytania.

 4
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-02 18:40:17

Spróbuj mojej prostej sztuczki:

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("classRegister:")) {                  
                Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
            }               
            view.loadUrl(url);
            return true;
        }

I mój link html:

<a href="classRegister:true">Go to register.java</a>

Lub możesz zrobić true" >

Jednak ten skrypt działa na mailto link:)

        if (url.startsWith("mailto:")) {
            String[] blah_email = url.split(":");
            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
            Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
            startActivity(emailIntent);
        }
 1
Author: IRvanFauziE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-19 07:32:00