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?


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.


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


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;


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 *


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.


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


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

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.


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

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


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.


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 .


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.