Ninguna actividad encontrada para manejar Intent action.VIEW al hacer clic en el enlace de correo electrónico

Recibí esta nueva excepción de bloqueo después de la actualización más reciente de la aplicación. Parece no apuntar a ninguna parte. ¿Alguien podría decir cuál es el problema? Parece un posible problema de formato de correo electrónico debido a esto: dat = mailto: xxxx@xxxxxxxxx.xxx (tiene extras) …. pero no estoy seguro de que tenga errores en los correos electrónicos.

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=mailto:xxxx@xxxxxxxxx.xxx (has extras) } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1512) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1384) at android.app.Activity.startActivityForResult(Activity.java:3190) at android.app.Activity.startActivity(Activity.java:3297) at android.text.style.URLSpan.onClick(URLSpan.java:62) at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:212) at android.widget.TextView.onTouchEvent(TextView.java:8344) at android.view.View.dispatchTouchEvent(View.java:5542) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1957) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1726) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1912) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371) at android.app.Activity.dispatchTouchEvent(Activity.java:2364) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1860) at android.view.View.dispatchPointerEvent(View.java:5722) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2897) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2473) at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:845) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2482) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) 

¡Gracias!

Aquí está el archivo de manifiesto:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mypackage" android:versionCode="123" android:versionName="1.2.3" > <supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true"/> <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="16"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <permission android:name="com.problemio.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.problemio.permission.C2D_MESSAGE" /> <!-- App receives GCM messages. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <!-- GCM requires a Google account. --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- Keeps the processor from sleeping when a message is received. --> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/CustomTheme" android:name="MyApplication" > <!-- For Google Cloud Messaging --> <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="com.problemio" /> </intent-filter> </receiver> <service android:name=".GCMIntentService" /> <!-- End of Google Cloud Messaging --> <activity android:name=".ProblemioActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".AddProblemActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/add_problem" /> <activity android:name=".LoginActivity" android:label="@string/login" /> <activity android:name=".MyProblemsActivity" android:label="@string/your_problems" /> <activity android:name=".CreateProfileActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/create_account" /> <activity android:name=".ProblemActivity" android:label="@string/problem_page_header" /> <activity android:name=".WePromoteActivity" android:label="@string/we_promote" /> <!-- <activity android:name=".SuggestSolutionActivity" android:label="@string/suggest_solution_header" /> <activity android:name=".SuggestedSolutionActivity" android:label="@string/suggested_solution_header" /> <activity android:name=".ViewSolutionsActivity" android:label="@string/view_solutions_header" /> --> <activity android:name=".TopicActivity" android:label="@string/topic_header" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="stateHidden"/> <activity android:name=".ForgotPasswordActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/forgot_password_heading" /> <activity android:name=".AskQuestionActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/ask_question_heading" /> <activity android:name=".QuestionActivity" android:label="@string/question_header" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="stateHidden"/> <activity android:name=".MyQuestionsActivity" android:label="@string/see_my_questions_header" /> <activity android:name=".LearnActivity" android:label="@string/learn_header" /> <activity android:name=".ExtraHelpActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/extra_help_header" /> <activity android:name=".content.AdvertisingActivity" android:label="@string/advertising_header" /> <activity android:name=".content.ProductStrategyActivity" android:label="@string/product_strategy_header" /> <activity android:name=".content.BusinessModelsActivity" android:label="@string/business_models_header" /> <activity android:name=".content.StageTacticsActivity" android:label="@string/stage_tactics_header" /> <activity android:name=".content.InvestorsActivity" android:label="@string/funding_header" /> <activity android:name=".content.TargetMarketActivity" android:label="@string/target_market_header" /> <activity android:name=".SettingsActivity" android:label="@string/settings_header" /> <activity android:name=".content.BusinessIdeasActivity" android:label="@string/business_ideas" /> <activity android:name=".content.MarketIdeaValidationActivity" android:label="@string/market_idea_validation" /> <activity android:name=".content.UnitEconomicsActivity" android:label="@string/unit_economics" /> <activity android:name=".content.PremiumWebAdvertisingActivity" android:label="@string/premium_web_marketing" /> <activity android:name=".content.PsychologyActivity" android:label="@string/business_psychology" /> <activity android:name=".NumberOfBusinessesActivity" android:label="@string/num_of_businesses" /> <activity android:name=".TimelineActivity" android:label="@string/timeline" /> <activity android:name=".content.PitchBusinessActivity" android:label="@string/pitch" /> <activity android:name=".content.TopMistakesActivity" android:label="@string/top_mistakes" /> <activity android:name=".content.MarktingAndConversionActivity" android:label="@string/marketing_and_conversion" /> <activity android:name=".content.HelpInstructionsActivity" android:label="@string/help_instructions" /> <activity android:name=".content.WebSetupActivity" android:label="@string/web_setup_page" /> <activity android:name=".UpdateProfileActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/update_profile" /> <activity android:name=".FeedbackActivity" android:label="@string/feedback" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="stateHidden"/> <activity android:name=".BaseActivity" /> <activity android:name=".BaseListActivity"/> <activity android:name=".EditBusinessActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/edit_business" /> <activity android:name=".TopicEditActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/topic_edit" /> <activity android:name=".InviteFriendsActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/invite_friends" /> <activity android:name=".EnterInviteCodeActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/enter_invite_code" /> <activity android:name=".CommunityActivity" android:configChanges="orientation|keyboardHidden" android:label="@string/community_page" /> <activity android:name=".CommunitySignupActivity" android:label="@string/community_signup" /> <activity android:name=".PlanExamplesActivity" android:label="@string/plan_examples" /> <activity android:name=".Settings" android:label="@string/plan_examples" /> <activity android:name=".GiveBackActivity" android:label="@string/give_back" /> <activity android:name=".MotivationActivity" android:label="@string/motivation_page" /> <activity android:name=".AdsActivity" android:label="@string/ads_activity" /> <activity android:name=".content.WebsiteServiceActivity" android:label="@string/website_service_activity" /> <activity android:name=".MoreArticlesActivity" android:label="@string/more_articles" /> <!-- <service android:name="BillingService" /> <receiver android:name="BillingReceiver"> <intent-filter> <action android:name="com.android.vending.billing.IN_APP_NOTIFY" /> <action android:name="com.android.vending.billing.RESPONSE_CODE" /> <action android:name="com.android.vending.billing.PURCHASE_STATE_CHANGED" /> </intent-filter> </receiver> --> <activity android:name="com.tapjoy.TJCOffersWebView" android:configChanges="keyboardHidden|orientation" /> <activity android:name="com.tapjoy.TapjoyFullScreenAdWebView" android:configChanges="keyboardHidden|orientation" /> <activity android:name="com.tapjoy.TapjoyDailyRewardAdWebView" android:configChanges="keyboardHidden|orientation" /> <activity android:name="com.tapjoy.TapjoyVideoView" android:configChanges="keyboardHidden|orientation" /> </application> </manifest> 

¿Podría algo como esto ser un problema:

 <TextView android:id="@+id/contact_email" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop ="15dp" android:autoLink="email" android:text="some@email.com" /> 

Copiado de mi otra respuesta

Ya he tenido el mismo problema, y ​​lo resolví mediante la creación de una nueva clase que comprueba si hay null antes de iniciar realmente el Intent .

Todo lo que tienes que hacer es reemplazar todas las URLSpan , antes de configurar el texto de TextView (lo que significa que no puedes usar setAutoLinkMask() ).

Esto tiene que hacerse, porque el URLSpan onClick() URLSpan no realiza ningún tipo de comprobación null .

Cómo proceder:

 TextView txt = ... txt.setLinksClickable(true); txt.setText(SafeURLSpan.parseSafeHtml(<<YOUR STRING GOES HERE>>)); txt.setMovementMethod(LinkMovementMethod.getInstance()); 

Tipos de cadenas que se pueden utilizar en <<YOUR STRING GOES HERE>> :

 "Click here: <a href=\"http://google.com\">My links</a>" "Mail me: <a href=\"mailto:john@doe.com\">My email</a>" ... and so on... 

Esta es la fuente de la clase SafeURLSPan (la uso en mi aplicación FPlay y se ha probado en Android 10+):

 import android.content.Context; import android.content.Intent; import android.net.Uri; import android.provider.Browser; import android.text.Html; import android.text.Spannable; import android.text.style.URLSpan; import android.view.View; public final class SafeURLSpan extends URLSpan { public SafeURLSpan(String url) { super(url); } @Override public void onClick(View widget) { try { final Uri uri = Uri.parse(getURL()); final Context context = widget.getContext(); final Intent intent = new Intent(Intent.ACTION_VIEW, uri); if (context != null && intent != null) { intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); context.startActivity(intent); } } catch (Throwable ex) { } } public static CharSequence parseSafeHtml(CharSequence html) { return replaceURLSpans(Html.fromHtml(html.toString())); } public static CharSequence replaceURLSpans(CharSequence text) { if (text instanceof Spannable) { final Spannable s = (Spannable)text; final URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); if (spans != null && spans.length > 0) { for (int i = spans.length - 1; i >= 0; i--) { final URLSpan span = spans[i]; final int start = s.getSpanStart(span); final int end = s.getSpanEnd(span); final int flags = s.getSpanFlags(span); s.removeSpan(span); s.setSpan(new SafeURLSpan(span.getURL()), start, end, flags); } } } return text; } } 

Me encontré con este problema también, la cosa es que cuando se define:

 android:autoLink="email" android:text="some@email.com" 

O cualquier otro tipo de autolink en un TextView, android maneja todo para usted.

En el emulador, el correo electrónico no está configurado de forma predeterminada, por lo que no hay ninguna aplicación para manejar la intención, y esto hace que tu aplicación se bloquee si haces clic en una dirección de correo electrónico desinstalada. Si abre la aplicación de correo y siga las instrucciones para configurarla, al hacer clic en la dirección de correo electrónico, funcionará.

No sé qué puede hacer para solucionar este problema. Supongo que podría no ser seguro asumir que el usuario tiene configuración de correo o al menos una aplicación capaz de manejar esa intención. También supongo que la aplicación no debe estar estrellándose … Creo que esto es un problema con Android, ya que en este caso no tiene forma de manejar la excepción.

Si observa el origen de URLSpan (Si se establece autolink, TextView utiliza android.text.util.Linkify.addLinks (..) que crea instancias de URLSpan para crear vínculos): http://grepcode.com/file/repository .grepcode.com / java / ext / com.google.android / android / 4.1.2_r1 / android / text / style / URLSpan.java # URLSpan

 public void onClick(View widget) { Uri uri = Uri.parse(getURL()); Context context = widget.getContext(); Intent intent = new Intent(Intent.ACTION_VIEW, uri); intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); context.startActivity(intent); } 

Ellos podrían manejar la excepción o usar PackageManager para determinar si el Intent tendría éxito antes de llamar a startActivity () (como recomiendan: http://developer.android.com/training/basics/intents/sending.html#Verify ) o usar Un selector.

Aunque la plataforma Android garantiza que determinadas intenciones se resolverán a una de las aplicaciones incorporadas (como la aplicación Teléfono, Correo electrónico o Calendario), siempre debe incluir un paso de verificación antes de invocar una intención.

Precaución: si invoca una intención y no hay ninguna aplicación disponible en el dispositivo que pueda manejar la intención, su aplicación se bloqueará.

Así que mi pregunta sería: ¿hay alguna garantía de que un intento de correo electrónico siempre se resolverá en un dispositivo real?

Ok … en la misma sección también mencionan:

Nota: Debe realizar esta comprobación cuando se inicie por primera vez la actividad en caso de que necesite desactivar la función que utiliza la intención antes de que el usuario intente utilizarla. Si sabes de una aplicación específica que puede manejar la intención, también puedes proporcionar un enlace para que el usuario descargue la aplicación (consulta cómo vincular a tu producto en Google Play).

Siempre se puede comprobar si la intención se resuelve a cualquier actividad al inicio de la aplicación, establecer una bandera y cada vez que el diseño que contiene TextView es inflado lo encontramos y deshabilitar el enlace automático de correo electrónico, etc (y esto es cuando reflexiono Matando a un unicornio sobre la codificación que)

Por cierto, ningún cliente de correo electrónico puede ocurrir si no hay una cuenta de correo electrónico configurada en el dispositivo, así que técnicamente esto también puede ocurrir en dispositivos reales. Aquí está el código para desactivar el AutoLink si no está disponible como lo sugiere novettam:

 protected boolean checkIntent(Intent intent) { PackageManager packageManager = getPackageManager(); List<ResolveInfo> apps = packageManager.queryIntentActivities(intent, 0); return apps.size() > 0 && !( apps.get(0).activityInfo.name.equals(activity.getClass().getName()) && apps.size() == 1) ; } protected Intent createDummyEmailIntent() { final Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts( "mailto", "abc@gmail.com", null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "EXTRA_SUBJECT"); return emailIntent; } protected Intent createDummyWebIntent() { final Intent webIntent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://www.google.co.uk")); return webIntent; } protected Intent createDummyPhoneIntent(){ String uri = "tel:" + "0131 666 7777".trim() ; final Intent phoneIntent = new Intent(Intent.ACTION_DIAL); phoneIntent.setData(Uri.parse(uri)); return phoneIntent; } //Checking if ( !checkIntent(intent) ) { textview.setAutoLinkMask(0); } //be sure that you call setText after this 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.