2012-11-28 6 views
10

Próbuję zezwolić użytkownikom na wybór kontaktu spośród osób z adresami e-mail. Jest to kod, który jest wykonywany po kliknięciu odpowiedniego przycisku:Występuje wyjątek dla niektórych użytkowników z wybieraniem kontaktów przez pocztę e-mail.

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); 
startActivityForResult(intent, PICK_CONTACT); 

to działa dobrze na moim telefonie, ale po zwolnieniu moją aplikację widzę następujący wyjątek występuje na niektórych moich użytkowników:

0  android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=content://com.android.contacts/data/emails } 
1 at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1638) 
2 at android.app.Instrumentation.execStartActivity(Instrumentation.java:1510) 
3 at android.app.Activity.startActivityForResult(Activity.java:3244) 
4 at com.fitrocket.android.InviteMethodSelectionAct.onClick(InviteMethodSelectionAct.java:59) 
5 at android.view.View.performClick(View.java:3549) 
6 at android.view.View$PerformClick.run(View.java:14400) 
7 at android.os.Handler.handleCallback(Handler.java:605) 
8 at android.os.Handler.dispatchMessage(Handler.java:92) 
9 at android.os.Looper.loop(Looper.java:154) 
10 at android.app.ActivityThread.main(ActivityThread.java:4945) 
11 at java.lang.reflect.Method.invokeNative(Native Method) 
12 at java.lang.reflect.Method.invoke(Method.java:511) 
13 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
14 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
15 at dalvik.system.NativeStart.main(Native Method) 

Nie byłem w stanie odtworzyć tego samemu, więc zastanawiam się, czy ktoś mógłby mi powiedzieć, jaki może być problem?

+0

Nie jest to rozwiązanie, ale jeśli nie możesz go znaleźć, możesz wypuścić wersję, która drukuje Build.MODEL i ciąg wiadomości e-mail (jeśli to możliwe), a także inne parametry, które powodują błąd w dzienniku i wysyłają go dla ciebie, abyś mógł lepiej ocenić/odtworzyć problem. Czasami, jeśli konkretny użytkownik wysyła e-mailem, możesz przesłać mu specjalną kompilację z takimi funkcjami rejestrowania, aby szybciej znaleźć problem. – KDEx

+0

To dobry pomysł, dziękuję. – Catherine

+0

Czy to jest zawsze naprawione? – sinek

Odpowiedz

3

Niezupełnie rozwiązanie, którego szukasz, ale to samo działo się dla mnie również podczas korzystania z intencji ACTION_PICK do wyboru aplikacji. Zwykle zdarza się, że uruchomienie tej czynności może potrwać dłuższy czas bez (pozornego) powodu, a czasami po prostu zawiesić się z wyjątkiem "Brak aktywności". W efekcie powstało moje własne działanie, które zawiera listę dostępnych aplikacji. W twoim przypadku prawdopodobnie możesz zrobić to samo dla kontaktów za pomocą kursora, aby wysłać zapytanie do wszystkich kontaktów pocztą e-mail i wyświetlić okno dialogowe/działanie, aby umożliwić wybór użytkownika. Brzmi strasznie obejście, ale może być najszybciej wdrożyć ... (zobacz przykładowy kod here)

Inna droga, byłoby skontaktować tych użytkowników i sprawdzić, czy mają niestandardową aplikację kontakty, które mogą nie obsługiwać typ zawartości ContactsContract.CommonDataKinds.Email.CONTENT_URI.

+0

+1 chociaż budowanie własnej działalności nie było w tej chwili możliwością. – sinek

3

Problem w tym, co widzę, polega na tym, że zakładamy, że każdy użytkownik ma zainstalowaną aplikację, która może odpowiedzieć na kombinację akcji i danych, którą chcemy wykonać. Chociaż założenie prawdopodobnie będzie prawdą w twoim przypadku, niektórzy użytkownicy mogli zdecydować się na bałagan w swoim systemie i mogli zainstalować aplikację do zarządzania swoimi kontaktami, które nie mogą odpowiedzieć na uruchomioną akcję. Niezależnie od powodu, zawsze należy sprawdzić dostępność aplikacji, aby odpowiedzieć na swoją Intent.

public static boolean isIntentAvailable(Context context, String action) 
{ 
    final PackageManager packageManager = context.getPackageManager(); 
    final Intent intent = new Intent(action); 
    List<ResolveInfo> list = 
      packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 

Ten kod zwróci true jeżeli co najmniej jedna aplikacja jest dostępna, które zostały określone jako parametr action. Zobacz oficjalną dokumentację dotyczącą problemu opisanego powyżej, pod numerem Intents and Intent Filters.

Teraz wszystko jest w porządku i dobrze, ale co rozwiąże? Po pierwsze aplikacja użytkownika nie ulegnie awarii. Następnie musisz wyleczyć się z faktu, że nie możesz kontynuować, jak myślałeś, że możesz. Zwykle wyświetlanie wiadomości użytkownikowi i proponowanie zainstalowania aplikacji, którą znasz, działa dobrze. Zwracam również uwagę na tę zależność w dokumentacji, aby wszyscy użytkownicy wiedzieli, czego potrzebują.

Aktualizuj: więcej źródeł, aby spojrzeć na:

Wierzę, że ta ostatnia posiada dokładne wyjaśnienie, dlaczego firmy awarie aplikacji.Cytuję:

"Caution: If you invoke an intent and there is no app available on the device that can handle the intent, your app will crash."

Sekcja ta posiada także więcej informacji na temat sposobów radzenia sobie z problemem.

+0

Ach, zapomniałem wspomnieć o tym wcześniej ... Tak to rozwiązałem. Najpierw testuję, czy intencja jest dostępna - jeśli nie, po prostu wyświetlam ogólny selektor kontaktów. Dzięki jednak - nagrodzi ją nagrodą. – sinek

+0

Nie ma za co. Zapoznaj się z ostatnim zasobem, który mam połączony, zawiera wskazówki, jak kierować użytkownika, aby uzyskać aplikację, której potrzebuje, aby pomyślnie uruchomić aplikację. – Eric

Powiązane problemy