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

141

这是我的代码,用于播放录制的音频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 我尝试使用3gp,但仍然抛出异常。 - jennifer
17个回答

203

网址必须以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");

10
太棒了!这个方案是必须的。在我的情况下,如果我不把Uri.parse()改成Uri.fromFile(),就会导致file://缺失。 - Stan
@Stan 谢谢你的解决方案。 - Serg Burlaka
如果这仍然不起作用,请不要忘记对URL字符串进行trim()处理。 :-) - Firzen
浏览器知道你所在的位置。如果你直接在应用程序上调用它,你需要指定路径。 - UserOfStackOverFlow
如果URL以file://开头,并且使用Uri.fromFile()仍然无法工作,该怎么办? - Freddy
显示剩余2条评论

62

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

www.google.com

而不是: https://www.google.comhttp://www.google.com

将此代码添加到您的Activity/Fragment中:

 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语句会处理此问题。


33

这是正确的做法。

    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
1
@jbass 如果你真的期望某些特定的错误会经常发生,那么这就不是一个例外情况,应该在之前进行预防。一般的异常处理是一个很好的想法,如果你并不关心原因,只是不想让你的应用程序崩溃。这里到底是什么未定义?try块中的最后一个命令启动了活动。之前的所有内容都不重要,将被垃圾回收。在这个try块中有6行代码,这很多吗?真的吗? - The incredible Jan
作为一种思想实验,为什么不将我们编写的所有内容都包装在try块中?为什么默认情况下不为我们完成这项工作呢?异常或多或少是设计用来崩溃程序以使错误更加明显,除非它们被明确地捕获。 - jbass
请确保URL中没有空格,因为如果URL中存在空格,也可能会出现此问题。 - Muhammad Afzal

28

对我而言,当尝试打开一个链接时:

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(即浏览器)的应用程序。安装了一个浏览器后,问题得以解决。

*教训:确保至少有一个应用程序能够处理您调用的意图*


7
那么我们应该如何处理这种情况? - Nikhil
如果没有带有定制ROM的自定义测试设备,你将无法进行网络活动。这听起来一点也不对。 - StarWind0
2
捕获错误,提示用户他们没有可用的浏览器。 - erluxman
1
查看解决方案 https://dev59.com/ZWEh5IYBdhLWcg3wYSk2。在这种情况下,您将知道设备是否包含默认浏览器(或处理深度链接的应用程序)。 - CoolMind
它解决了我的问题,我试图打开一个 .csv 文件。没有安装任何应用程序来处理 .csv 文件,因此出现了错误。为了找出问题,我不得不将文件扩展名临时更改为我确定有一个可以打开的应用程序的扩展名 .txt,然后它就可以工作了。所以我安装了一个可以处理电子表格的应用程序。 - iloo
显示剩余2条评论

18

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最后一次出现已经接近两个月了。 - Maragues
这就是我所做的。可惜,在找到解决方案之后,我才读到了这个答案 :) - Janis Peisenieks
请确保URL中没有空格,因为当URL中存在空格时,也可能会出现此问题。 - Muhammad Afzal

14

如果您没有传递正确的网页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();
    }
}

确保URL中没有空格,因为当URL中存在空格时,也可能会出现此问题。 - Muhammad Afzal

10

请看这个有用的方法:

URLUtil.guessUrl(urlString)

它可以将google.com转换为http://google.com


7

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

您可以使用tangerine解决方案来处理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


是的!这个答案展示了如何处理这个问题。 - JCutting8

5

为避免崩溃,需要检查以下2件事:

  1. 检查URL是否以http或https开头
  2. 检查设备是否有任何可以处理URL的应用程序

Kotlin

if (url.startsWith("http") || url.startsWith("https")) {
    Intent(Intent.ACTION_VIEW,Uri.parse(url)).apply{
    // Below condition checks if any app is available to handle intent
    if (resolveActivity(packageManager) != null) {
           startActivity(this)
       }
    }
}

4

我曾经遇到了同样的问题,所以我查看了LogCat中记录的意图。当从相册查看视频时,它调用了相同的Intent.View意图,但将类型设置为“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
请确保URL中没有空格,因为在URL中存在空格时也可能会出现此问题。 - Muhammad Afzal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接