Xamarin Android 应用程序因“意图必须包含显式包名称来构建 android-app”而崩溃

Posted

技术标签:

【中文标题】Xamarin Android 应用程序因“意图必须包含显式包名称来构建 android-app”而崩溃【英文标题】:Xamarin Android app crashing with "Intent must include an explicit package name to build an android-app" 【发布时间】:2017-05-21 01:18:03 【问题描述】:

我的Xamarin android 应用程序需要弹出图库,以便用户可以选择现有照片,在这种情况下,我再次保存所选图像的 URI。

在我的一个测试用户拥有的 Galaxy S5 上,它每次都崩溃。但它在我更便宜/更旧的华为测试手机上运行良好。

我正在使用 Azure Mobile Center 进行崩溃报告,我在错误日志中看到了这一点。从 Galaxy S5 实时调试时,我还看到直接从 Visual Studio 中抛出此错误...

Intent 必须包含一个明确的包名来构建一个 android-app: 意图 dat=content://media/external/images/media/4238 flg=0x1 VirtualScreenParam=ParamsmDisplayId=-1, null, mFlags=0x00000000) (有额外的)

这是我创建从图库中选择的意图的方法:

    public void HandleRecord(object sender, EventArgs ea)
    
        ...
                //Choose from gallery
                else if (args.Which == 1)
                
                    var intent = new Intent(Intent.ActionPick);
                    intent.SetType("image/*");
                    this.StartActivityForResult(Intent.CreateChooser(intent, "Select Picture"), SELECT_FILE);
                
        
    

代码在我的 OnActivityResult 方法的这一行崩溃了...

 if (requestCode == SELECT_FILE)
            
                ImageUri = Android.Net.Uri.Parse(data.ToUri(IntentUriType.AndroidAppScheme));

【问题讨论】:

哪些 API 版本崩溃了?它们都一样吗? (即 API 21?) 从我在 Azure Mobile Center 中看到的,主要设备是“SM-G930F”(Galaxy S7?)所以我认为它真的是新的,即版本 23? 拍照或选择照片后应用崩溃?每次应用崩溃时,您是否也会遇到相同的错误? 你试过用 Intent.ActionGetContent 代替 Intent.ActionPick 吗? 检查是否有相机应用程序可用于处理此意图,即执行 intent.ResolveActivity(packageManager) != null 如果没有,那么我建议预安装一个好的相机应用程序来处理像 opencamera 这样的意图跨度> 【参考方案1】:

天哪,找到了。在 API 23+ 上,我必须在声明“从图库中选择图像”选项的意图时添加这行代码:

intent.SetPackage("com.android.gallery");

所以整体代码变成了:

                    var intent = new Intent(Intent.ActionGetContent );
                    intent.SetType("image/*");
                    intent.SetPackage("com.android.gallery");
                    this.StartActivityForResult(Intent.CreateChooser(intent, "Select Picture"), SELECT_FILE);

我永远不会明白为什么在已经声明了 Intent.ActionPick 类型之后我需要这样做,但是嘿它可以工作并且不再抛出错误。

【讨论】:

然后在旧的 KitKat 设备上运行此代码时,我收到了权限错误。所以计算出 Intent.ActionPick 应该改为 Intent.ActionGetContent - 现在权限问题已解决,原始问题也已解决!

以上是关于Xamarin Android 应用程序因“意图必须包含显式包名称来构建 android-app”而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

xamarin ios 应用程序因 CBCentralManager 崩溃

Xamarin.mac 资源本地化不会因当前文化而改变

Xamarin.forms(或)xamarin.ios/xamarin.android(或)本机

将Xamarin.Android应用程序迁移到Xamarin.Forms应用程序

有哪些ios或android应用是用xamarin开发的

C#使用Xamarin开发Android应用程序 -- 系列文章