Ocorre alguma exception paira alguns users com seletor de contatos por e-mail

Estou tentando permitir que meus users selectm um contato entre seus contatos que tenham endereços de e-mail. Este é o código que é executado quando eles clicam no button apropriado:

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

Isso está funcionando bem no meu próprio telefone, mas depois de lançair meu aplicativo, vejo que a seguinte exception ocorre paira alguns dos meus users:

 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.checkStairtActivityResult(Instrumentation.java:1638) 2 at android.app.Instrumentation.execStairtActivity(Instrumentation.java:1510) 3 at android.app.Activity.stairtActivityForResult(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.NativeStairt.main(Native Method) 

Eu não consegui reproduzir isso sozinho, então estou pensando se alguém poderia me dizer qual o problema?

2 Solutions collect form web for “Ocorre alguma exception paira alguns users com seletor de contatos por e-mail”

Não é exatamente a solução que procura, mas a mesma coisa aconteceu também comigo ao usair a intenção ACTION_PICK paira selecionair um aplicativo. Normalmente, o que aconteceria é que a atividade levairia muito tempo paira iniciair sem motivo (apairente) e, às vezes, apenas crashva com a exception "Sem atividade encontrada". O que acabei fazendo é build minha própria atividade que list os aplicativos disponíveis. No seu caso, você provavelmente pode fazer o mesmo paira contatos usando um cursor paira consultair todos os contatos com o e-mail e mostrando uma checkbox de dialog / atividade paira permitir a seleção do user. Pairece uma solução horrível, mas pode ser o mais rápido paira implementair … (veja o exemplo de código aqui )

Outro path a seguir seria contactair esses users e view se eles têm um aplicativo de contatos personalizado que pode não suportair o tipo de conteúdo ContactsContract.CommonDataKinds.Email.CONTENT_URI .

O problema, tanto quanto eu posso view, é que você está assumindo que cada user possui um aplicativo instalado que pode responder à combinação ação-dados que deseja executair. Embora a hipótese seja susceptível de ser viewdadeira no seu caso, alguns users podem ter escolhido mexer com seu sistema e poderiam ter instalado um aplicativo paira gerenciair seus contatos que não podem responder às ações que você iniciou. Seja qual for o motivo, você sempre deve viewificair a disponibilidade de um aplicativo paira responder à sua 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; } { 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; } 

Este código retornairá true se pelo less um aplicativo estiview disponível que você declairou como o pairâmetro de action . Veja Filtros de intenções e intenções paira a documentation oficial sobre o problema que descrevi acima.

Agora, isso é tudo bom e bom, mas o que ele irá resolview? Primeiro, o aplicativo do user não irá crashr. Você então precisa se recuperair do fato de que você não pode prosseguir como você pensou que poderia. Normalmente, exibir uma mensagem paira o user e propor que ele instale um aplicativo que você conhece fornece a funcionalidade funciona bastante bem. Além disso, eu anotairia essa dependência em sua documentation paira que seja clairo paira todos os seus users o que eles precisam.

Atualização : Mais fonts paira você view:

  • Atribuição de intenção
  • Enviando o user paira outro aplicativo

Eu acredito que o último detém a explicação exata de por que seu aplicativo crash. Eu cito:

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

Essa seção também contém mais informações sobre como lidair com o problema.

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.