Intent를 처리 할 활동이 없습니다. android.intent.action.VIEW


98

녹음 된 오디오 3gp 파일을 재생하는 코드입니다.

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

하지만 내 HTC 기기 (Android 2.2 Froyo)에서 실행하는 동안 예외가 표시됩니다.

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)

Galaxy 태블릿에서는 잘 작동합니다. 이 문제를 어떻게 해결할 수 있습니까?


1
파일이 .3gp이고 시스템에 mp3 데이터를 재생하도록 지시하기 때문입니까?
Blundell

@Blundell 난 여전히 예외가 발생 BT는 3GP로 시도
제니퍼

답변:


155

URL 주소 앞에는 http : //가 와야합니다.

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

ActivityNotFoundException이 발생합니다. "http : //"를 앞에 추가하면 문제가 해결 된 것입니다.

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

OP에 도움이되지 않을 수도 있지만, 여기에서 동일한 예외를 검색하고 다른 사람들에게 도움이 될 수도 있습니다.


8
훌륭한! 계획은 필수입니다. file://나는 변경 될 때까지 내 경우에는 실종 Uri.parse()Uri.fromFile().
Stan

솔루션에 대한 @Stan 고맙습니다
Serg Burlaka

URL이 인코딩 될 때 문제가 발생 했으므로 수행해야 할 수도 있습니다Uri.parse(Uri.decode(encodedString))
hmac

40

Android 앱에서 웹 페이지를 열려고 할 때이 오류가 발생하는 경우 URL이 다음과 같기 때문입니다.

www.google.com

대신 : https://www.google.com또는http://www.google.com

다음 코드를 활동 / 조각에 추가하십시오.

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

URL을에 전달하십시오 openWebPage(). 이미 접두사 https://또는 http://다음으로 가셔 도 좋습니다. 그렇지 않으면 if 문이 처리합니다.


34

이것이 올바른 방법입니다.

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

import android.webkit.MimeTypeMap을 가져와야합니다.


D :이 긴 그것을 할 수있는 방법입니다
umerk44

1
일반 예외를 사용하여 try 블록에 많은 코드를 래핑하는 것은 일반적으로 좋은 생각이 아닙니다. 여기서 동작은 완전히 정의되지 않았습니다. 어떤 입력이 메시지를 인쇄할지 한 눈에 알 수 있습니까? 어떤 예외가 발생하며 그 이유는 무엇입니까? 이것은 철저하게 테스트되지 않은 코드의 표시입니다.
jbass

19

링크를 열려고 할 때 나를 위해 :

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

같은 오류가 발생했습니다 android.content.ActivityNotFoundException: No Activity found to handle Intent

문제는 휴대 전화에 URL (예 : 브라우저)을 열 수있는 앱이 설치되어 있지 않았기 때문입니다. 따라서 브라우저를 설치 한 후 문제가 해결되었습니다.

* Lesson : 호출하는 인 텐트를 처리하는 앱이 하나 이상 있는지 확인합니다. *


6
그렇다면이 상황을 어떻게 처리 할 수 ​​있을까요?
Nikhil

사용자 지정 ROM이있는 사용자 지정 테스트 장치가 없으면 인터넷 활동이 있습니다. 이것은 전혀 옳지 않은 것 같습니다.
StarWind0

고객이 동일한 문제를보고하고 있습니다. 따라서 기본 인터넷 브라우저가 설치되지 않은 일부 장치가있는 것 같습니다. 이것을 해결하는 방법?
Abhijit

오류를 포착하고 브라우저가 작동하지 않는다는 정보 / 대화 / 토스트를 제공합니까?
erluxman

1
stackoverflow.com/questions/22479211/… 솔루션을 참조하십시오 . 이 경우 장치에 기본 브라우저 (또는 딥 링크를 처리하는 응용 프로그램)가 포함되어 있는지 알 수 있습니다.
CoolMind

17

Maragues의 답변으로 logcat 출력을 확인했습니다. Uri로 전달하는 경로에 접두사를 붙여야하는 것으로 나타납니다.
file:/

스토리지에 대한 로컬 경로이기 때문입니다.

경로 자체도보고 싶을 수 있습니다.

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

마운트 지점이 전체 경로에서 두 번 나타나는 것 같습니다.


이것은 정답 인 것 같지만 질문은 오래되었고 OP는 거의 2 개월 전에 마지막으로 확인되었습니다
Maragues

이것이 내가 한 일입니다. 내가 솔루션 : 발견 후 슬프게도, 나는 단지이 답변을 읽고
제니스 Peisenieks을

10

올바른 웹 URL을 전달하지 않고 브라우저가없는 경우 ActivityNotFoundException이 발생하므로 해당 요구 사항을 확인하거나 예외를 명시 적으로 처리하십시오. 문제를 해결할 수 있습니다.

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

나는 이와 동일한 문제가 있었기 때문에 LogCat에 로그인 된 의도를보고있었습니다. 갤러리에서 비디오를 볼 때 동일한 Intent.View 인 텐트를 호출했지만 Type을 "audio / *"로 설정하여 문제를 해결하고 MimeTypeMap을 가져올 필요가 없습니다. 예:

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

1
intent.setDataAndType (data, "video / *") 사용시 동영상에서도 작동합니다 .
Nestor

3

이 예외가 다음으로 변경 되었습니까?

"오디오 / *"

그러나 @Stan 에게 감사드립니다. 나는 매우 간단하지만 유용하게 해결책 을 찾았습니다 .

Uri.fromFile(File(content)) 대신 Uri.parse(path)

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

누군가가 문제를 해결하는 데 도움이되기를 바랍니다.


3

logcat에 이러한 오류가 있으면 다음 코드를 사용하면 도움이됩니다.

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

또한

   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

먼저 AndroidManifest 내에서이 코드를 시도하세요.

  <application>

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

이 코드가 작동하면 괜찮습니다. 그러나 그렇지 않다면. 데이터 또는 URI를 전달하려는 클래스 에서이 코드를 시도하십시오 .

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

이것이 문제를 해결할 수 있기를 바랍니다. 감사합니다


1

두 가지 아이디어가 있습니다.

첫째 : 3gp 파일을 재생하려면 "audio / 3gpp"또는 "audio / mpeg"MIME 유형을 사용해야합니다.

두 번째 : MIME 유형없이 사용 방법 setData(data)을 시도 할 수 있습니다 intent.

도움이 되었기를 바랍니다.


여전히 예외 05-04 17 : 30 : 30.022 : WARN / System.err (4937) : android.content.ActivityNotFoundException : Intent를 처리 할 활동이 없습니다. {act = android.intent.action.VIEW dat = / mnt / sdcard / audio-android.3gp}이 표시되고 있습니다
jennifer

안드로이드가 3gp 파일을 지원합니까? developer.android.com/guide/appendix/media-formats.html
Pasha

1

이 예외는 Deep linking기본값이 설치되지 않은 경우 브라우저 를 처리 하거나 URL을 처리 할 때 발생할 수 있습니다 . 딥 링킹의 경우 형식의 링크를 처리 할 수있는 애플리케이션이 설치되어 있지 않을 수 있습니다 myapp://mylink.

API에 대해 최대 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()
    }
}

API> = 30의 경우 intent.resolveActivity가 API 30에서 null을 반환 함을 참조 하세요 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.