找不到用于处理Intent的活动:android.intent.action.VIEW


97

这是我播放录制的音频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我试图与3GP BT还是抛出异常
珍妮弗

Answers:


154

网址必须以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 thanx寻求解决方案
Serg Burlaka '18

在对网址进行编码时,我遇到了问题,因此请注意,您可能需要做Uri.parse(Uri.decode(encodedString))
hmac

40

如果您尝试从Android应用程序打开网页时也遇到此错误,那是因为您的网址看起来像这样:

www.google.com

代替: https://www.google.comhttp://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);
    }
}

只需将您的网址传递给即可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(即浏览器)的应用程序。因此,安装浏览器后,问题得以解决。

*课程:请确保至少有一个应用程序可以处理您正在调用的意图*


6
那么我们如何处理这种情况呢?
Nikhil

如果没有带有自定义ROM的自定义测试设备,您将进行Internet活动。这听起来根本不对。
StarWind0

我有一个客户报告同样的问题。因此,似乎有些设备上没有安装默认的Internet浏览器。如何解决呢?
阿比吉特

捕获错误并提供信息/对话框/吐司,他们没有可用的浏览器?
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

这就是我所做的。可悲的是,只有找到解决方法后,我才读这个答案:)
Janis Peisenieks

10

如果未传递正确的Web 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 intent,但是将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 2014年

3

甚至将此例外更改为

“音频/ *”

但是thanx到@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文件,则应使用mime类型“ audio / 3gpp”或“ audio / mpeg”

其次:你可以尝试使用方法setData(data)intent,没有任何MIME类型。

希望这可以帮助。


仍然是例外05-04 17:30:30.022:WARN / System.err(4937):android.content.ActivityNotFoundException:找不到用于处理Intent的活动{act = android.intent.action.VIEW dat = / mnt / sdcard /音频-android.3gp}显示
詹妮弗

Android是否支持您的3gp文件?developer.android.com/guide/appendix/media-formats.html
帕夏

1

Deep linking如果没有安装默认值,则在处理浏览器或URL 时会引发此异常。如果使用深层链接,则可能没有安装可以处理格式链接的应用程序myapp://mylink

您最多可以将蜜桔解决方案用于29个API:

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.