No se encontró actividad para manejar Intent: android.intent.action.VIEW

97

Este es mi código para reproducir el archivo 3gp de audio grabado

 Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
        Uri data = Uri.parse(path);
        intent.setDataAndType(data, "audio/mp3");
        startActivity(intent);

Pero mientras lo ejecuto en mi dispositivo HTC (Android 2.2 Froyo) muestra una excepción:

05-04 16:37:37.597: WARN/System.err(4065): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }
05-04 16:37:37.597: WARN/System.err(4065):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1567)
05-04 16:37:37.597: INFO/ActivityManager(92): Starting activity: Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1537)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Activity.startActivityForResult(Activity.java:2858)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Activity.startActivity(Activity.java:2964)
05-04 16:37:37.607: WARN/System.err(4065):     at com.ey.camera.AudioRecorder.playAudio(AudioRecorder.java:244)
05-04 16:37:37.607: WARN/System.err(4065):     at com.ey.camera.AudioRecorder$4.onClick(AudioRecorder.java:225)
05-04 16:37:37.607: WARN/System.err(4065):     at android.view.View.performClick(View.java:2408)
05-04 16:37:37.607: WARN/System.err(4065):     at android.view.View$PerformClick.run(View.java:8817)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Handler.handleCallback(Handler.java:587)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Looper.loop(Looper.java:144)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.ActivityThread.main(ActivityThread.java:4937)
05-04 16:37:37.607: WARN/System.err(4065):     at java.lang.reflect.Method.invokeNative(Native Method)
05-04 16:37:37.607: WARN/System.err(4065):     at java.lang.reflect.Method.invoke(Method.java:521)
05-04 16:37:37.607: WARN/System.err(4065):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-04 16:37:37.607: WARN/System.err(4065):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-04 16:37:37.607: WARN/System.err(4065):     at dalvik.system.NativeStart.main(Native Method)

En la tableta Galaxy está funcionando bien. ¿Cómo puedo resolver este problema?

Jennifer
fuente
1
¿Es porque su archivo es un .3gp y le está diciendo al sistema que reproduzca datos que sean mp3?
Blundell
@Blundell lo intenté con 3gp bt todavía se lanza la excepción
jennifer

Respuestas:

154

Las direcciones URL deben ir precedidas de http: //

Uri uri = Uri.parse("www.google.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

arroja una ActivityNotFoundException. Si antepone "http: //", problema resuelto.

Uri uri = Uri.parse("http://www.google.com");

Puede que no ayude a OP, pero terminé aquí buscando la misma excepción y tal vez ayude a otros.

Maragues
fuente
8
¡Magnífico! El esquema es imprescindible. file://faltaba en mi caso hasta que me cambié Uri.parse()a Uri.fromFile().
Stan
@Stan gracias por la solución
Serg Burlaka
Estaba teniendo un problema cuando se codificó la URL, así que tenga en cuenta que es posible que deba hacerloUri.parse(Uri.decode(encodedString))
hmac
40

Si también recibe este error al intentar abrir una página web desde su aplicación de Android, es porque su URL se ve así:

www.google.com

en lugar de: https://www.google.comohttp://www.google.com

agregue este código a su Actividad / Fragmento:

 public void openWebPage(String url) {

    Uri webpage = Uri.parse(url);

    if (!url.startsWith("http://") && !url.startsWith("https://")) {
        webpage = Uri.parse("http://" + url);
    }

    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

simplemente pase su URL a openWebPage(). Si ya tiene el prefijo https://o http://entonces está listo para comenzar, de lo contrario, la declaración if lo maneja por usted

Ojonugwa Jude Ochalifu
fuente
34

Esta es la forma correcta de hacerlo.

    try
    {
    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
    File file = new File(aFile.getAbsolutePath()); 
    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    myIntent.setDataAndType(Uri.fromFile(file),mimetype);
    startActivity(myIntent);
    }
    catch (Exception e) 
    {
        // TODO: handle exception
        String data = e.getMessage();
    }

necesitas importar import android.webkit.MimeTypeMap;

Nitan Sehgal
fuente
este es el camino más largo para hacerlo: d
umerk44
1
Envolver tanto código en un bloque de prueba con una excepción general generalmente no es una buena idea. El comportamiento aquí es totalmente indefinido: ¿puede decir qué entradas imprimirán un mensaje de un vistazo? ¿Qué excepciones surgirán y por qué? Esta es una señal de código que no se ha probado a fondo.
jbass
19

Para mí cuando intento abrir un enlace:

Uri uri = Uri.parse("https://www.facebook.com/abc/");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);

Tengo el mismo error android.content.ActivityNotFoundException: No Activity found to handle Intent

El problema fue porque no tenía ninguna aplicación que pueda abrir URL (es decir, navegadores) instalada en mi teléfono. Entonces, después de instalar un navegador, el problema se resolvió.

* Lección: asegúrese de que haya al menos una aplicación que maneje la intención que está llamando *

erluxman
fuente
6
Entonces, ¿cómo podemos manejar esta situación?
Nikhil
sin un dispositivo de prueba personalizado con una ROM personalizada, tendrá una actividad en Internet. Esto no suena nada bien.
StarWind0
Un cliente me ha informado del mismo problema. Por lo tanto, parece que hay algunos dispositivos en los que no hay un navegador de Internet predeterminado instalado. ¿Cómo solucionar esto?
Abhijit
¿Detectar el error y dar información / diálogo / brindis de que no tienen un navegador que funcione?
erluxman
1
Vea una solución stackoverflow.com/questions/22479211/… . En este caso, sabrá si un dispositivo contiene un navegador predeterminado (o una aplicación que procesa un enlace profundo).
CoolMind
17

La respuesta de Maragues me hizo comprobar la salida de logcat. Parece que la ruta que pasa a Uri debe tener el prefijo
file:/

Dado que es una ruta local a su almacenamiento.

Es posible que también desee mirar el camino en sí.

`05-04 16:37:37.597: WARN/System.err(4065): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }`

El punto de montaje parece aparecer dos veces en la ruta completa.

Joel Bodega
fuente
esta parece ser la respuesta correcta, pero la pregunta es antigua y OP se vio por última vez hace casi 2 meses
Maragues
Esto es lo que hice. Lamentablemente, solo leí esta respuesta después de encontrar las soluciones :)
Janis Peisenieks
10

Si no pasa la URL web correcta y no tiene un navegador, se produce ActivityNotFoundException, así que verifique esos requisitos o maneje la excepción explícitamente. Eso puede resolver tu problema.

public static void openWebPage(Context context, String url) {
    try {
        if (!URLUtil.isValidUrl(url)) {
            Toast.makeText(context, " This is not a valid link", Toast.LENGTH_LONG).show();   
        } else {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            context.startActivity(intent);
        }
    } catch (ActivityNotFoundException e) {
        Toast.makeText(context, " You don't have any browser to open web page", Toast.LENGTH_LONG).show();
    }
}
Ram narayan Raigar
fuente
3

Tuve este mismo problema, así que estaba mirando la intención que está registrada en LogCat. Al ver el video de la Galería, llamó al mismo intento Intent.View, pero configuró el Tipo en "audio / *", lo que solucionó mi problema y no requiere importar MimeTypeMap. Ejemplo:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
Uri data = Uri.parse(path);
intent.setDataAndType(data, "audio/*");
startActivity(intent);
Adán
fuente
1
También funciona para videos cuando se usa intent.setDataAndType (data, "video / *") ;
Nestor
3

¿Había cambiado esta excepción a

"audio/*"

Pero gracias a @Stan, me he convertido en una solución muy simple pero útil:

Uri.fromFile(File(content)) en lugar Uri.parse(path)

 val intent =Intent(Intent.ACTION_VIEW)
                    intent.setDataAndType(Uri.fromFile(File(content)),"audio/*")
                    startActivity(intent)

Espero que ayude a alguien a solucionar su problema.

Serg Burlaka
fuente
3

Si tiene estos errores en su logcat, use este código, me ayuda

 Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(new File(data.getLocation())), "audio/*");
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Log.d("error", e.getMessage());
            }

además

   Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER);
            intent.setDataAndType(Uri.fromFile(new File(data.getLocation())), "audio/*");
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Log.d("error", e.getMessage());
            }
Mujahid Khan
fuente
2

Primero intente este código dentro de AndroidManifest

  <application>

    <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />
 </application>

Si este código funciona, muy bien. Pero si no. Pruebe este código de la clase a la que desea pasar los datos o uri.

Intent window = new Intent(getApplicationContext(), Browser.class);
window.putExtra("LINK", "http://www.yourwebsite.com");
startActivity(window);

Espero que esto resuelva su problema. Gracias

Mukta
fuente
1

Tengo dos ideas:

Primero: si desea reproducir un archivo 3gp, debe usar los tipos mime "audio / 3gpp" o "audio / mpeg"

Y en segundo lugar: se puede tratar método de uso setData(data)para intentsin ningún tipo de MIME.

Espero que esto ayude.

Bajá
fuente
sigue siendo la excepción 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: No se encontró actividad para manejar Intent {act = android.intent.action.VIEW dat = / mnt / sdcard / Se muestra audio-android.3gp}
jennifer
¿Android es compatible con su archivo 3gp? developer.android.com/guide/appendix/media-formats.html
Pasha
1

Esta excepción puede surgir cuando maneja una Deep linkingURL para un navegador, si no hay una instalación predeterminada. En caso de enlaces profundos, es posible que no haya ninguna aplicación instalada que pueda procesar un enlace en formato myapp://mylink.

Puede utilizar la solución mandarina para API hasta 29:

private fun openUrl(url: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    val activityInfo = intent.resolveActivityInfo(packageManager, intent.flags)
    if (activityInfo?.exported == true) {
        startActivity(intent)
    } else {
        Toast.makeText(
            this,
            "No application that can handle this link found",
            Toast.LENGTH_SHORT
        ).show()
    }
}

Para API> = 30, consulte intent.resolveActivity devuelve nulo en API 30 .

CoolMind
fuente
0

intente verificar con cualquier URL como agregar

https://www.google.com

en la ruta y comience la actividad si funciona, entonces está agregando una ruta incorrecta

Desarrollador Ars
fuente