没有找到处理意图的活动:android.intent.action.VIEW

Posted

技术标签:

【中文标题】没有找到处理意图的活动:android.intent.action.VIEW【英文标题】:No Activity found to handle Intent : android.intent.action.VIEW 【发布时间】:2011-08-18 11:12:33 【问题描述】:

这是我播放录制的音频 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 平板电脑中,它运行良好。我该如何解决这个问题?

【问题讨论】:

是不是因为你的文件是 .3gp 并且你告诉系统播放 mp3 的数据? @Blundell 我尝试使用 3gp bt 仍然抛出异常 【参考方案1】:

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

【讨论】:

太棒了!该计划是必须的。在我将 Uri.parse() 更改为 Uri.fromFile() 之前,file:// 在我的情况下丢失。 @Stanthanx 寻求解决方案 我在对 url 进行编码时遇到了问题,所以请注意您可能需要执行 Uri.parse(Uri.decode(encodedString)) 如果还是不行,别忘了trim() URL 字符串。 :-) 浏览器知道你在哪里。如果直接在应用程序上调用,则需要指定路径。【参考方案2】:

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

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 语句会为你处理

【讨论】:

【参考方案3】:

这是正确的做法。

    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 将这么多代码包装在一个带有一般异常的 try 块中通常不是一个好主意。这里的行为是完全未定义的——你能一眼看出哪些输入会打印一条消息吗?会出现什么异常,为什么?这是代码未经彻底测试的标志。 @jbass 如果您真的希望某些特定错误或多或少经常发生,那也不例外,应该在此之前防止。如果您并不真正关心原因并且只是不希望您的应用程序崩溃,那么一般性的例外是捕获它们的一个非常好的主意。这里究竟是什么未定义? try 块中的最后一个命令启动活动。之前的一切都无关紧要,都会被垃圾收集。这个 try 块中的 6 行应该很多吧?真的吗?不这么认为。【参考方案4】:

我在尝试打开链接时:

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 的应用程序(即 浏览器)安装在我的手机中。所以安装浏览器后 问题解决了。

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

【讨论】:

那么我们该如何处理这种情况呢? 如果没有带有自定义 ROM 的自定义测试设备,您将拥有互联网活动。这听起来根本不对。 我遇到了客户报告的相同问题。所以似乎有些设备上没有安装默认的互联网浏览器。如何解决? 发现错误并提供信息/对话/吐司他们没有工作的浏览器? 查看解决方案***.com/questions/22479211/…。在这种情况下,您将知道设备是否包含默认浏览器(或处理深度链接的应用程序)。【参考方案5】:

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 个月前 这就是我所做的。可悲的是,我在找到解决方案后才阅读此答案:)【参考方案6】:

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

【讨论】:

【参考方案7】:

检查这个有用的方法:

URLUtil.guessUrl(urlString)

它使 google.com -> http://google.com

【讨论】:

【参考方案8】:

我遇到了同样的问题,所以我正在查看登录 LogCat 的意图。从 Gallery 查看视频时,它调用了相同的 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);

【讨论】:

在使用 intent.setDataAndType(data, "video/*"); 时也适用于视频【参考方案9】:

如果您的 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());
            

【讨论】:

【参考方案10】:

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

您可以将tangerine 解决方案用于最多 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 returns null in API 30。

【讨论】:

是的!一个演示如何处理问题的答案。【参考方案11】:

这个异常甚至更改为

“音频/*”

但是thanx to @Stan我已经变成了非常简单但有用的解决方案:

Uri.fromFile(File(content)) 而不是Uri.parse(path)

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

【讨论】:

【参考方案12】:

为了避免崩溃,需要检查以下两件事

    检查url是http还是https开头 检查设备是否有任何可以处理 url 的应用程序

科特林

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)
       
    

【讨论】:

【参考方案13】:

我有两个想法:

首先:如果你想播放 3gp 文件,你应该使用 mime 类型“audio/3gpp”或“audio/mpeg”

第二个:你可以尝试使用方法setData(data)intent 没有任何mime 类型。

【讨论】:

仍然是异常 05-04 17:30:30.022: WARN/System.err(4937): android.content.ActivityNotFoundException: No Activity found to handle Intent act=android.intent.action. VIEW dat=/mnt/sdcard/audio-android.3gp 正在显示 android支持你的3gp文件吗? developer.android.com/guide/appendix/media-formats.html【参考方案14】:

首先在 AndroidManifest

中尝试此代码
  <application>
       
    <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />
 </application>

如果此代码有效,那就太好了。但如果没有。试试这段代码,你想从哪个 class 传递数据或 uri。

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

【讨论】:

【参考方案15】:

尝试检查任何网址,如添加

https://www.google.com

在路径中并开始活动 如果它比你添加错误的路径有效

【讨论】:

【参考方案16】:

而不是使用 Try and catch。你应该这样使用

val intent = Intent(Intent.ACTION_VIEW)
                    intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                    intent.setDataAndType(uri, type)    
startActivity(Intent.createChooser(intent, "view action"))

【讨论】:

以上是关于没有找到处理意图的活动:android.intent.action.VIEW的主要内容,如果未能解决你的问题,请参考以下文章

没有找到处理意图的活动:android.intent.action.VIEW

未找到处理意图的活动

离子角电容器 - 未找到 FileOpener 活动:未找到处理意图的活动

没有找到处理 Intent 的活动:android.intent.action.EDIT

如何在创建后通过更改活动来处理推送通知意图?

通过意图传递可序列化对象