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)?
- ¿Es posible iniciar la actividad a través de adb shell y recibir su respuesta?
- ¿cómo volver a la actividad principal en android?
- Intercambio de datos entre fragmentos y actividad en Android
- Aplicación para Android, estado de actividad (en ejecución, no en ejecución, en primer plano / fondo)
- Fab.show () no animado por primera vez después de inicializar nueva actividad
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>
- Almacenamiento de mapa de bits para múltiples actividades?
- Patrón para reutilizar Android AsnycTask sobre varias actividades?
- ¿Cómo eliminar la actividad singleTask con taskAffinity de las tareas recientes cuando está terminado?
- Android en la animación
- Android con poca memoria, por ninguna razón obvia
- ¿Por qué no se lanza mi actividad por URL?
- Android: Captura del retorno de una actividad
- Android Comunicación entre Broadcast Receiver y MainActivity (Enviar datos a la actividad)
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.