2010-08-25 14 views
7

Wiem, że to było już wiele razy zadawane w StackOverflow, ale jeszcze nie znalazłem rozwiązania. Moja aplikacja wysyła e-mail z linkiem, który po kliknięciu powinien uruchomić aplikację.Uruchamianie aplikacji za pomocą intencji URI

Według @hackbod, najlepszym sposobem, aby to zrobić, jest skorzystanie z URI Intent (patrz this). Tu jest mój kod, który ustawia intencję i umieszcza go w organizmie email:

Intent customIntent = new Intent(CUSTOM_ACTION); 
customIntent.setPackage(MY_PACKAGE); 
customIntent.addCategory(MY_CAT_BROWSABLE); 
customIntent.addCategory(MY_CAT_DEFAULT); 

String customUri = customIntent.toUri(Intent.URI_INTENT_SCHEME); 

String emailBody = getString(R.string.intent_link, customUri); 

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("text/html"); 
intent.putExtra(Intent.EXTRA_SUBJECT, "Recommending vid"); 
intent.putExtra(Intent.EXTRA_TEXT , Html.fromHtml(emailBody)); 
try { 
    startActivity(Intent.createChooser(intent, "Choose email client:")); 
} catch (android.content.ActivityNotFoundException ex) { 
    Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); 
} 

To, co dostaję od LogCat:

08-25 17:01:23.333: VERBOSE/Test URI(16987): intent:#Intent;action=com.test.project.action.VIEW_VID_FROM_LINK;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;package=com.test.project;end 
08-25 17:01:23.338: VERBOSE/Test email text(16987): Hi,<br><br>Testing intents from an email.<br><br> A standard website: <a href=http://www.google.com>Go to Google</a>.<br><br> This link should launch the app: <a href=intent:#Intent;action=com.test.project.action.VIEW_VID_FROM_LINK;category=android.intent.category.DEFAULT;category=android.intent.category.BROWSABLE;package=com.test.project;end>Click link to launch</a>. 

Kiedy przeglądać wiadomości e-mail od mojego telefonu za pomocą aplikacji Gmail Mogę kliknąć link Google i uruchamia przeglądarkę, nie ma problemu z tym.

Ale link do intencji nie jest nawet możliwy do kliknięcia (podczas gdy z wersji roboczej wygląda na to, że powinien być klikalny na). Czy ktoś próbował tego i sprawił, że działa?

From draft: link looks clickableSent email: link not clickable

EDIT # 1: Próbowałem również ustawienie działania do Intent.ACTION_VIEW ale link nadal nie jest klikalny.

EDYCJA # 2: Wygląda na to, że link naprawdę jest klikalny na. Próbowałem użyć innego klienta poczty e-mail, a linki są klikalne! Wygląda na to, że istnieje błąd w Gmailu. No cóż. Ale widocznie jest to trudniejsze, niż myślałem. Próbowałem za pomocą:

Uri.Builder builder = new Uri.Builder(); 
builder.scheme("my.own.scheme"); 
builder.authority("my.authority"); 
Uri newUri = builder.build(); 
Intent customIntent = new Intent(CUSTOM_ACTION, newUri); 

Jak sugeruje @CommonsWare, próbowałem sprawdzając czy są odbiorcami tego customIntent. Wygląda na to, że jest jeden, czego się spodziewałem. Następnym krokiem jest uczynienie tego zamiaru identyfikatorem URI, którego mogę użyć w wiadomości e-mail. Użyłem:

String customUri = customIntent.toUri(Intent.URI_INTENT_SCHEME); 

, które w oparciu o moje rozumienie dokumentacji, powinien dać mi coś podobnego zwykłych linków http, tylko z systemem ustawionym na intent. Mogę następnie użyć tego customUri jako wartości dla linków w e-mailu. ALE, wygląda na to, że tak nie jest. Czy ktokolwiek ma przykład tego, co musi powrócić do tego, co musi być .toUri?

+0

Trwa to długo, ale myślę, że znalazłem problem. To jest intencja Chcę, aby link się odrodził: 'Intent {act = com.test.project.action.CUSTOM_ACTION dat = com.test.project: //my.authority}'.Zamiast tego otrzymuję ten zamiar po kliknięciu łącza w wiadomości e-mail: 'Intent {act = android.intent.action.VIEW dat = intent: //my.authority#Intent; scheme = com.test.project; action = com.test.project.action.CUSTOM_ACTION; end (ma dodatki)} '. W oparciu o dokumentację Intent.parseUri (String uri, int flags) klient poczty e-mail interpretuje mój URI jako * NOT * generowany przez toUri(). Czy moje założenie jest poprawne? – Zarah

+0

czy byłeś w stanie to uruchomić i jakie było rozwiązanie? Dzięki! – hopia

+0

@hopia Nie próbowałem tego od dłuższego czasu. Możesz spojrzeć na komentarze między mną a CommonsWare poniżej, aby przyjrzeć się moim odkryciom podczas dochodzenia. Możesz również wypróbować nowszą odpowiedź poniżej (jeszcze jej nie wypróbowałeś). :) – Zarah

Odpowiedz

4

Możesz wypróbować cytaty z adresów URL w swoich elementach <a>, ponieważ tak powinien być napisany HTML.

Można także spróbować potwierdzający, poprzez parseUri(), PackageManager, a queryIntentActivities(), jeśli generowane URL postanawia coś - jeśli nie, to nie ma problemu z adresem URL.

pokazano użycie URI_INTENT_SCHEME, w przypadku, gdy daje ci to jakieś pomysły.

+0

(whooops, coś nie tak z formatowaniem tam). Sprawdzę twój link do obsługi URL-a, dziękuję! Ale myślę, że stanę w obliczu tej przeszkody, gdy tylko klikę link, który można kliknąć. Spróbuje również sprawdzić poprawność adresu URL, poinformuje Cię. :) Dziękuję jak zawsze! :) – Zarah

+0

@Zarah: Chodzi mi o to, że link może nie być klikalny, jeśli Android nie może znaleźć nic, aby obsłużyć kliknięcie. – CommonsWare

3

Użyj flagi zero, aby utworzyć URI z niestandardowym schematem. Intent.URI_INTENT_SCHEME Flaga wymusza użycie schematu "intent:" (i ogólnie przyjętej składni URI).

String customUri = customIntent.toUri(0); 
Powiązane problemy