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.