Aucune activité trouvée pour gérer l'intention: android.intent.action.VIEW


97

Ceci est mon code pour lire le fichier audio 3gp enregistré

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

Mais lors de son exécution dans mon appareil HTC (Android 2.2 Froyo) montre une exception:

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)

Dans la tablette Galaxy, cela fonctionne bien. Comment puis-je résoudre ce problème?


1
Est-ce parce que votre fichier est un .3gp et que vous dites au système de lire des données qui sont des mp3?
Blundell

@Blundell j'ai essayé avec 3gp bt toujours l'exception est levée
Jennifer

Réponses:


154

Les adresses URL doivent être précédées de http: //

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

lève une ActivityNotFoundException. Si vous ajoutez "http: //", le problème est résolu.

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

Peut-être pas aider OP, mais j'ai fini ici à la recherche de la même exception et peut-être que cela aide les autres.


8
Superbe! Le programme est un must. file://manquait dans mon cas jusqu'à ce que je change Uri.parse()pour Uri.fromFile().
Stan

@Stan merci pour la solution
Serg Burlaka

J'avais un problème lors du codage de l'URL, alors notez que vous devrez peut-être le faireUri.parse(Uri.decode(encodedString))
hmac

40

Si vous obtenez également cette erreur lorsque vous essayez d'ouvrir une page Web à partir de votre application Android, c'est parce que votre URL ressemble à ceci:

www.google.com

au lieu de: https://www.google.comouhttp://www.google.com

ajoutez ce code à votre activité / fragment:

 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);
    }
}

passez simplement votre URL à openWebPage(). S'il est déjà précédé de https://ou http://alors vous êtes prêt à partir, sinon l'instruction if gère cela pour vous


34

C'est la bonne façon de procéder.

    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();
    }

vous devez importer import android.webkit.MimeTypeMap;


c'est le long chemin pour le faire: d
umerk44

1
Emballer autant de code dans un bloc try avec une exception générale n'est généralement pas une bonne idée. Le comportement ici est totalement indéfini - pouvez-vous dire quelles entrées imprimeront un message en un coup d'œil? Quelles exceptions surviendront et pourquoi? C'est un signe de code qui n'a pas été testé de manière approfondie.
jbass

19

Pour moi, lorsque j'essaye d'ouvrir un lien:

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

J'ai eu la même erreur android.content.ActivityNotFoundException: No Activity found to handle Intent

Le problème était que je n'avais aucune application pouvant ouvrir des URL (c'est-à-dire des navigateurs) installée sur mon téléphone. Ainsi, après l'installation d'un navigateur, le problème a été résolu.

* Leçon: assurez-vous qu'il existe au moins une application qui gère l'intention que vous appelez *


6
Alors, comment pouvons-nous gérer cette situation?
Nikhil

sans appareil de test personnalisé avec une ROM personnalisée, vous aurez une activité Internet. Cela ne sonne pas du tout.
StarWind0

J'ai le même problème signalé par un client. Il semble donc qu'il existe certains appareils sur lesquels aucun navigateur Internet par défaut n'est installé. Comment résoudre ça?
Abhijit

Attraper l'erreur et donner une info / dialogue / toast qu'ils n'ont pas de navigateur fonctionnel?
erluxman

1
Voir une solution stackoverflow.com/questions/22479211/… . Dans ce cas, vous saurez si un appareil contient un navigateur par défaut (ou une application qui traite un lien profond).
CoolMind le

17

Réponse de Maragues m'a fait vérifier la sortie logcat. Apparaît que le chemin que vous passez à Uri doit être préfixé avec
file:/

Puisqu'il s'agit d'un chemin local vers votre stockage.

Vous voudrez peut-être aussi regarder le chemin lui-même.

`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 }`

Le point de montage semble apparaître deux fois dans le chemin complet.


cela semble être la bonne réponse, mais la question est ancienne et OP a été vue pour la dernière fois il y a presque 2 mois
Maragues

C'est ce que j'ai fait. Malheureusement, je n'ai lu cette réponse qu'après avoir trouvé les solutions :)
Janis Peisenieks

10

Si vous ne transmettez pas l'URL Web correcte et que vous n'avez pas de navigateur, ActivityNotFoundException se produit, vérifiez donc ces exigences ou gérez l'exception explicitement. Cela peut résoudre votre problème.

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();
    }
}


3

J'ai eu ce même problème, donc je regardais l'intention qui est enregistrée dans LogCat. Lors de la visualisation de la vidéo à partir de la galerie, elle a appelé le même intent Intent.View, mais a défini le type sur "audio / *", ce qui a résolu mon problème et ne nécessite pas l'importation de MimeTypeMap. Exemple:

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

1
Fonctionne également pour les vidéos lors de l'utilisation d' intent.setDataAndType (data, "video / *") ;
Nestor

3

Cette exception avait-elle même changé en

"l'audio/*"

Mais merci à @Stan, je suis devenu une solution très simple mais utile:

Uri.fromFile(File(content)) au lieu Uri.parse(path)

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

J'espère que cela aidera quelqu'un à résoudre son problème.


3

Si vous avez ces erreurs dans votre logcat, utilisez ce code, cela m'aide

 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());
            }

aussi

   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());
            }

2

Essayez d'abord ce code dans AndroidManifest

  <application>

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

Si ce code fonctionne, tout va bien. Mais sinon. Essayez ce code à partir de la classe à partir de laquelle vous souhaitez transmettre les données ou l'URI.

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

J'espère que cela résoudra votre problème. Je vous remercie


1

J'ai deux idées:

Premièrement: si vous voulez lire un fichier 3gp, vous devez utiliser les types mime "audio / 3gpp" ou "audio / mpeg"

Et deuxièmement: vous pouvez essayer d'utiliser la méthode setData(data)pour intentsans aucun type mime.

J'espère que cela t'aides.


toujours l'exception 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: Aucune activité trouvée pour gérer l'intention {act = android.intent.action.VIEW dat = / mnt / sdcard / audio-android.3gp} s'affiche
jennifer

Android prend-il en charge votre fichier 3gp? developer.android.com/guide/appendix/media-formats.html
Pasha

1

Cette exception peut se déclencher lorsque vous gérez Deep linkingou URL pour un navigateur, si aucune valeur par défaut n'est installée. En cas de lien profond, il se peut qu'aucune application ne soit installée pour traiter un lien au format myapp://mylink.

Vous pouvez utiliser la solution tangerine pour API jusqu'à 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()
    }
}

Pour l'API> = 30, consultez intent.resolveActivity renvoie null dans l'API 30 .


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.