Nessuna attività trovata per gestire l'intento: android.intent.action.VIEW


97

Questo è il mio codice per riprodurre il file 3gp audio registrato

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

Ma durante l'esecuzione sul mio dispositivo HTC (Android 2.2 Froyo) mostra un'eccezione:

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)

Nel tablet Galaxy funziona bene. Come posso risolvere questo problema?


1
È perché il tuo file è un .3gp e stai dicendo al sistema di riprodurre dati che sono mp3?
Blundell

@Blundell ho provato con 3gp bt ancora l'eccezione viene lanciata
jennifer

Risposte:


154

Gli indirizzi URL devono essere preceduti da http: //

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

genera un'ActivityNotFoundException. Se anteponi "http: //", problema risolto.

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

Potrebbe non aiutare OP, ma sono finito qui a cercare la stessa eccezione e forse aiuta gli altri.


8
Stupendo! Lo schema è d'obbligo. file://mancava nel mio caso finché non sono passato Uri.parse()a Uri.fromFile().
Stan

@Stan grazie per la soluzione
Serg Burlaka

Ho Uri.parse(Uri.decode(encodedString))
riscontrato

40

Se ricevi questo errore anche quando provi ad aprire una pagina web dalla tua app Android è perché il tuo URL ha questo aspetto:

www.google.com

invece di: https://www.google.comohttp://www.google.com

aggiungi questo codice alla tua attività / frammento:

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

basta passare il tuo URL a openWebPage(). Se è già preceduto da https://o http://allora sei a posto, altrimenti l'istruzione if lo gestisce per te


34

Questo è il modo giusto per farlo.

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

devi importare import android.webkit.MimeTypeMap;


questa è la strada più lunga per farlo: d
umerk44

1
Racchiudere così tanto codice in un blocco try con un'eccezione generale di solito non è una buona idea. Il comportamento qui è totalmente indefinito: puoi dire quali input stamperanno un messaggio a colpo d'occhio? Quali eccezioni sorgeranno e perché? Questo è un segno di codice che non è stato testato a fondo.
jbass

19

Per me quando provo ad aprire un collegamento:

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

Ho ricevuto lo stesso errore android.content.ActivityNotFoundException: No Activity found to handle Intent

Il problema era perché non avevo alcuna app in grado di aprire URL (cioè browser) installati nel mio telefono. Quindi dopo aver installato un browser il problema è stato risolto.

* Lezione: assicurati che ci sia almeno un'app che gestisce l'intento che stai chiamando *


6
Allora come possiamo gestire questa situazione?
Nikhil

senza un dispositivo di prova personalizzato con una ROM personalizzata, avrai un'attività Internet. Non suona affatto bene.
StarWind0

Sto riscontrando lo stesso problema segnalato da un cliente. Quindi sembra che ci siano alcuni dispositivi su cui non è installato un browser Internet predefinito. Come risolverlo?
Abhijit

Cattura l'errore e dai un info / dialog / toast che non hanno un browser funzionante?
erluxman

1
Vedi una soluzione stackoverflow.com/questions/22479211/… . In questo caso saprai se un dispositivo contiene un browser predefinito (o un'applicazione che elabora un collegamento profondo).
CoolMind

17

La risposta di Maragues mi ha fatto controllare l'output di logcat. Sembra che il percorso che passi a Uri debba essere preceduto da
file:/

Poiché è un percorso locale per il tuo archivio.

Potresti anche voler guardare il percorso stesso.

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

Il punto di montaggio sembra apparire due volte nel percorso completo.


questa sembra essere la risposta giusta, ma la domanda è vecchia e OP è stato visto l'ultima volta quasi 2 mesi fa
Maragues

Questo è quello che ho fatto. Purtroppo, ho letto questa risposta solo dopo aver trovato le soluzioni :)
Janis Peisenieks

10

Se non si passa l'URL Web corretto e non si dispone di un browser, si verifica ActivityNotFoundException, quindi controllare tali requisiti o gestire l'eccezione in modo esplicito. Questo può risolvere il tuo 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();
    }
}


3

Ho avuto lo stesso problema, quindi stavo guardando l'intento che è registrato in LogCat. Durante la visualizzazione del video dalla Galleria, ha chiamato lo stesso intento Intent.View, ma ha impostato il tipo su "audio / *", che ha risolto il mio problema e non richiede l'importazione di MimeTypeMap. Esempio:

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

1
Funziona anche per i video quando si utilizza intent.setDataAndType (data, "video / *") ;
Nestor

3

Questa eccezione era persino cambiata in

"Audio/*"

Ma grazie a @Stan ho trasformato una soluzione molto semplice ma utile:

Uri.fromFile(File(content)) anziché Uri.parse(path)

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

Spero che aiuti qualcuno a risolvere il suo problema.


3

Se hai questi errori nel tuo logcat, usa questo codice mi aiuta

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

anche

   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

Prima prova questo codice all'interno di AndroidManifest

  <application>

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

Se questo codice funziona, va bene. Ma se no. Prova questo codice dalla classe a cui vuoi passare i dati o uri.

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

Spero che questo risolva il tuo problema. Grazie


1

Ho due idee:

Primo: se vuoi riprodurre file 3gp dovresti usare i tipi MIME "audio / 3gpp" o "audio / mpeg"

E secondo: puoi provare a usare il metodo setData(data)per intentsenza alcun tipo MIME.

Spero che questo ti aiuti.


ancora l'eccezione 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: Nessuna attività trovata per gestire Intent {act = android.intent.action.VIEW dat = / mnt / sdcard / audio-android.3gp} sta trasmettendo
Jennifer


1

Questa eccezione può sollevarsi quando si gestisce Deep linkingo l'URL di un browser, se non è installato alcun valore predefinito. In caso di collegamento profondo, potrebbe non essere installata alcuna applicazione in grado di elaborare un collegamento in formato myapp://mylink.

Puoi utilizzare la soluzione mandarino per API fino a 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()
    }
}

Per API> = 30 vedere intent.resolveActivity restituisce null nell'API 30 .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.