No se ha encontrado ninguna actividad (navegador) con prefijo http: // válido

Así que tengo una excepción de mi aplicación de la siguiente manera:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://google.com (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:3248) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:839) at android.app.Activity.startActivity(Activity.java:3359) 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:8704) at android.view.View.dispatchTouchEvent(View.java:5556) 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:1940) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1390) at android.app.Activity.dispatchTouchEvent(Activity.java:2414) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1888) at android.view.View.dispatchPointerEvent(View.java:5736) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3017) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2582) at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:887) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2591) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4697) 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:787) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) at dalvik.system.NativeStart.main(Native Method) 

Esto no conduce a mi código. Supongo que esto sucede cuando el usuario hace clic en la URL en el texto (y hay textos con URL en la aplicación). ¿De qué se trata? ¿Cómo podría ser que el dispositivo Android no tiene un navegador? ¿Cómo evitar esto o al menos capturar (necesito que las URL se puedan hacer clic en texto)?

ACTUALIZAR
En realidad, he encontrado que esta excepción ocurre en TextView que está destinado a ser un stub vista lista vacía:

 listView = (ListView) findViewById(R.id.listView); // empty pass list with clickable url inside final TextView listEmptyView = (TextView) findViewById(R.id.txtNoPasses); listEmptyView.setMovementMethod(LinkMovementMethod.getInstance()); listView.setEmptyView(listEmptyView); 

Así que he intentado esto (siguiendo el artículo de CommonsWare), pero mi URL sigue siendo completamente unclickable en este caso:

  listView = (ListView) findViewById(R.id.listView); // empty pass list with clickable url inside final TextView listEmptyView = (TextView) findViewById(R.id.txtNoPasses); fixTextView(listEmptyView); listView.setEmptyView(listEmptyView); } private void fixTextView(TextView textView) { final SpannableString current = new SpannableString(textView.getText()); final URLSpan[] spans = current.getSpans(0, current.length(), URLSpan.class); int start, end; for (URLSpan span : spans) { start = current.getSpanStart(span); end = current.getSpanEnd(span); current.removeSpan(span); current.setSpan(new DefensiveURLSpan(span.getURL()), start, end, 0); } } private static class DefensiveURLSpan extends URLSpan { public DefensiveURLSpan(String url) { super(url); } @Override public void onClick(View widget) { try { android.util.Log.d(getClass().getSimpleName(), "Got here!"); super.onClick(widget); } catch (ActivityNotFoundException e) { // do something useful here // android.text.SpannedString cannot be cast to android.text.SpannableString } } } 

Y TextView:

 <TextView android:id="@+id/txtNoPasses" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:visibility="gone" android:gravity="center" android:padding="15dp" android:text="@string/no_passes" android:textAppearance="?android:attr/textAppearanceMedium"/> 

Y la cadena no_passes es la siguiente:

 <string name="no_passes">Currently you have no cards to use.\n<a href="http://cardz.website.com">You could add some cards from our website</a></string> 

Supongo que se trata de un TextView con android:autolink conjunto, o que de otra forma muestra HTML (por ejemplo, utilizando Html.fromHtml() ).

Los problemas es que esto crea instancias de URLSpan para URIs incrustados, y esta clase "ciegamente" llama a startActivity() con el URI suministrado. Esto se bloquea cuando el URI no coincide con ninguna actividad registrada. Para URLs "http" esto puede suceder cuando el dispositivo no tiene una aplicación de navegador o (más probablemente) cuando se utiliza un perfil restringido que bloquea el acceso a él.

El problema y su solución está bien explicada en este post de CommonsWare . Puede reemplazar las instancias de URLSpan con una clase derivada personalizada que intercepta onClick() para evitar la excepción.

Véase también esta respuesta para un tema relacionado.

Es posible que un dispositivo Android no tenga un navegador. No es necesario, por decir, pero obviamente muy raro. Dispositivos Android-ish como Kindles vienen a la mente, aunque todavía tendrían un navegador …

No obstante, puede desactivar la vinculación de URL en su TextView siguiente manera:

 textView.setLinksClickable(false); 

También, pregunta relacionada .

Editar

Ver esta respuesta:

 String url = "http://www.example.com"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); PackageManager manager = mContext.getPackageManager(); List<ResolveInfo> list = manager.queryIntentActivities(intent, 0); if (list != null && list.size() > 0) { //You have at least one activity to handle the intent } else { //No activity to handle the intent. } 

Cree una nueva intención con ACTION_VIEW y una url y utilice este patrón para determinar si el dispositivo tiene alguna aplicación que pueda manejar una url. Si no lo hace, deshabilita hacer clic en vínculos en TextView para ese usuario.

  • recorte circular bitmap en android
  • Android - Fadeout animación para la pantalla de bienvenida
  • SoftKeyboard abrir y cerrar escucha en una actividad en Android?
  • android usando setlistadapter () sin extender listactivity
  • Android: Borrar pila de actividad
  • AppCompatActivity no se puede asignar a Actividad
  • Ciclo de vida de actividad de Android y ciclo de código nativo de JNI
  • Animación de Flip de Tarjeta entre Actividades
  • ¿Cómo muestra Froyo un cuadro de diálogo encima de la pantalla de inicio?
  • ¿Cuál es la diferencia entre windowBackground y el fondo para el estilo de las actividades?
  • Pasar cadenas entre actividades en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.