Nie znaleziono działania obsługującego zamiar: android.intent.action.VIEW

98

To jest mój kod do odtwarzania nagranego pliku audio 3gp

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

Ale podczas uruchamiania go na moim urządzeniu HTC (Android 2.2 Froyo) pokazuje wyjątek:

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)

W tablecie Galaxy działa dobrze. Jak mogę rozwiązać ten problem?

jennifer
źródło
1
Czy to dlatego, że twój plik to .3gp i mówisz systemowi, aby odtwarzał dane w formacie mp3?
Blundell
@Blundell próbowałem z 3gp bt nadal wyjątek jest rzucany
jennifer

Odpowiedzi:

155

Adresy URL muszą być poprzedzone przedrostkiem http: //

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

zgłasza ActivityNotFoundException. Jeśli dodasz „http: //”, problem został rozwiązany.

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

Może nie pomóc OP, ale znalazłem się tutaj, szukając tego samego wyjątku i może pomaga innym.

Maragues
źródło
8
Wspaniały! Schemat jest koniecznością. file://brakowało w moim przypadku, dopóki nie zmieniłem Uri.parse()na Uri.fromFile().
Stan
@Stan thanx for solution
Serg Burlaka
Podczas kodowania Uri.parse(Uri.decode(encodedString))
adresu
40

Jeśli również pojawia się ten błąd podczas próby otwarcia strony internetowej z aplikacji na Androida, oznacza to, że Twój adres URL wygląda następująco:

www.google.com

zamiast: https://www.google.comlubhttp://www.google.com

dodaj ten kod do swojej Aktywności / Fragmentu:

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

po prostu przekaż swój adres URL do openWebPage(). Jeśli jest już poprzedzony przedrostkiem https://lub, http://możesz zacząć, w przeciwnym razie instrukcja if załatwi to za Ciebie

Ojonugwa Jude Ochalifu
źródło
34

To jest właściwy sposób, aby to zrobić.

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

musisz zaimportować import android.webkit.MimeTypeMap;

Nitan Sehgal
źródło
to jest długa droga: d
umerk44
1
Pakowanie tak dużej ilości kodu w blok try z ogólnym wyjątkiem zwykle nie jest dobrym pomysłem. Zachowanie tutaj jest całkowicie nieokreślone - czy możesz od razu stwierdzić, które dane wejściowe spowodują wydrukowanie wiadomości? Jakie wyjątki się pojawią i dlaczego? To znak kodu, który nie został gruntownie przetestowany.
jbass
19

Dla mnie, gdy próbuję otworzyć link:

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

Mam ten sam błąd android.content.ActivityNotFoundException: No Activity found to handle Intent

Problem polegał na tym, że nie miałem zainstalowanej w telefonie żadnej aplikacji, która może otwierać adresy URL (tj. Przeglądarek). Więc po zainstalowaniu przeglądarki problem został rozwiązany.

* Lekcja: Upewnij się, że istnieje co najmniej jedna aplikacja, która obsługuje intencję, do której dzwonisz *

erluxman
źródło
6
Jak więc możemy sobie poradzić w tej sytuacji?
Nikhil
bez niestandardowego urządzenia testowego z niestandardową pamięcią ROM będziesz mieć aktywność internetową. To wcale nie brzmi dobrze.
StarWind0
Mam ten sam problem zgłoszony przez klienta. Wygląda więc na to, że na niektórych urządzeniach nie ma zainstalowanej domyślnej przeglądarki internetowej. Jak to rozwiązać?
Abhijit
Złap błąd i podaj info / dialog / toast, że nie mają działającej przeglądarki?
erluxman
1
Zobacz rozwiązanie stackoverflow.com/questions/22479211/… . W takim przypadku dowiesz się, czy urządzenie zawiera domyślną przeglądarkę (lub aplikację, która przetwarza głębokie łącze).
CoolMind
17

Odpowiedź udzielona przez Maragues sprawiła, że ​​sprawdziłem wyjście logcat. Wygląda na to, że ścieżka, którą przekazujesz do Uri, musi być poprzedzona prefiksem
file:/

Ponieważ jest to lokalna ścieżka do twojego magazynu.

Możesz też spojrzeć na samą ścieżkę.

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

Punkt montowania wydaje się pojawiać dwa razy na pełnej ścieżce.

Joel Bodega
źródło
to wydaje się być właściwą odpowiedzią, ale pytanie jest stare, a OP było ostatnio widziane prawie 2 miesiące temu
Maragues
To właśnie zrobiłem. Niestety, przeczytałem tę odpowiedź dopiero po znalezieniu rozwiązań :)
Janis Peisenieks
10

Jeśli nie przekażesz poprawnego adresu URL i nie masz przeglądarki, wystąpi wyjątek ActivityNotFoundException, więc sprawdź te wymagania lub jawnie obsłuż wyjątek. To może rozwiązać twój problem.

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
źródło
7

Sprawdź tę przydatną metodę:

URLUtil.guessUrl(urlString)

To sprawia, że ​​google.com -> http://google.com

niko1312
źródło
3

Miałem ten sam problem, więc patrzyłem na intencję, która jest zalogowana w LogCacie. Podczas oglądania wideo z Galerii wywoływał tę samą intencję Intent.View, ale ustawił Type na „audio / *”, co rozwiązało mój problem i nie wymaga importowania MimeTypeMap. Przykład:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
Uri data = Uri.parse(path);
intent.setDataAndType(data, "audio/*");
startActivity(intent);
Adam
źródło
1
Działa również w przypadku filmów, gdy używa się intent.setDataAndType (data, "video / *") ;
Nestor,
3

Gdyby ten wyjątek zmienił się nawet na

"audio/*"

Ale dzięki @Stan zmieniłem bardzo proste, ale użyteczne rozwiązanie:

Uri.fromFile(File(content)) zamiast Uri.parse(path)

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

Mam nadzieję, że pomoże to komuś rozwiązać jego problem.

Serg Burlaka
źródło
3

Jeśli masz ten błąd w swoim logcat, użyj tego kodu, pomóż mi

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

również

   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
źródło
2

Najpierw wypróbuj ten kod w AndroidManifest

  <application>

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

Jeśli ten kod działa, to dobrze. Ale jeśli nie. Wypróbuj ten kod, z której klasy chcesz przekazać dane lub identyfikator URI.

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

Mam nadzieję, że to rozwiąże Twój problem. Dziękuję Ci

Mukta
źródło
1

Mam dwa pomysły:

Po pierwsze: jeśli chcesz odtworzyć plik 3gp, użyj typów MIME „audio / 3gpp” lub „audio / mpeg”

A po drugie: można spróbować metody użycia setData(data)dla intentbez jakiegokolwiek typu MIME.

Mam nadzieję że to pomoże.

Basza
źródło
nadal wyjątek 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: Nie znaleziono działania obsługującego zamiar {act = android.intent.action.VIEW dat = / mnt / sdcard / Audio-android.3gp} jest wyświetlany
jennifer
Czy Android obsługuje Twój plik 3GP? developer.android.com/guide/appendix/media-formats.html
Pasha
1

Ten wyjątek może wystąpić podczas obsługi Deep linkinglub adresu URL przeglądarki, jeśli nie ma zainstalowanej domyślnej. W przypadku głębokiego linkowania może nie być zainstalowana żadna aplikacja, która może przetworzyć link w formaciemyapp://mylink .

Możesz użyć roztworu mandarynki dla API do 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()
    }
}

W przypadku interfejsu API> = 30 zobacz intent.resolveActivity zwraca wartość null w interfejsie API 30 .

CoolMind
źródło
0

spróbuj sprawdzić z dowolnym adresem URL, takim jak add

https://www.google.com

w ścieżce i rozpocznij działanie, jeśli to działa, niż dodajesz złą ścieżkę

Ars Developer
źródło