使用相机意图时未调用 OnActivityResult()?

Posted

技术标签:

【中文标题】使用相机意图时未调用 OnActivityResult()?【英文标题】:OnActivityResult() not being called when using a Camera intent? 【发布时间】:2021-08-22 20:43:44 【问题描述】:

我正在尝试在我的 Xamarin.android 应用程序中创建一个具有按钮的页面(我们称之为第 2 页),当您按下该按钮时,相机应用程序将打开。然后你拍照,接受你拍的照片,然后你应该回到原来有相机按钮的页面(第2页),你拍的图像会显示在按钮下面。

问题是我的重写 OnActivityResult() 方法在您接受图片后永远不会被调用。您按下按钮,相机应用程序打开,您拍照,接受照片,相机应用程序关闭,您将返回到相机按钮页面之前的页面(因此您现在位于第 1 页)。我认为相机应用程序本身正在崩溃?我不确定如何找到这些日志。有时会弹出一个窗口显示“不幸的是,相机已停止”。我猜这是我试图将拍摄的照片保存到手机本身的方式?我看到的唯一错误是在设备日志中,偶尔它会抛出一个权限错误,说我无权写入手机上的存储设备,但我在清单文件中有“写”权限。我的目标是 API 26。

有什么想法吗?

点击按钮的方法如下:

private int PIC_REQUEST_CODE = 1;
private ImageView imageView;
private Java.IO.File image;

private void Button_Click(object sender, EventArgs e)
    
      Intent takePictureIntent = new Intent(MediaStore.ActionImageCapture);
      if (takePictureIntent.ResolveActivity(PackageManager) != null)
      
        try
        
          // Create an image file name
          string timeStamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
          string imageFileName = "JPEG_" + timeStamp + "_";
          Java.IO.File storageDir = GetExternalFilesDir(global::Android.OS.Environment.DirectoryPictures);
          Java.IO.File image = Java.IO.File.CreateTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
          );

          global::Android.Net.Uri photoURI = FileProvider.GetUriForFile(ApplicationContext, PackageName + ".fileprovider", image);
          takePictureIntent.PutExtra(MediaStore.ExtraOutput, photoURI);
          takePictureIntent.AddFlags(ActivityFlags.GrantWriteUriPermission);

          StartActivityForResult(takePictureIntent, PIC_REQUEST_CODE);
        
        catch (Exception ex)
        
          //Not sure what to do, but here's a break point at least.
          Toast.MakeText(this, "blah blah something went wrong", ToastLength.Short).Show();
        
      
    

这是我的简单 OnActivityResult 被跳过/从未调用过:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    
      if (requestCode == PIC_REQUEST_CODE && resultCode == Result.Ok)
      
        Bitmap bitmap = (Bitmap)data.Extras.Get("data");
        imageView.SetImageBitmap(bitmap);
      
    

【问题讨论】:

您的意思是在 OnActivityResult() 中有一个 if(resultCode != Result.Ok) 吗?代码永远不会进入 OnActivityResult() 方法根本。所以我无论如何都无法检查 if() 语句。 我测试了您提供的代码。捕获图像并选择勾号后,将触发OnActivityResult @WendyZang-MSFT 是的。但它不会为我触发。 【参考方案1】:

我发现当前没有调用 OnActivityResult() 的问题。在我声明的类的顶部

[Activity(Label = "@string/page_name", ScreenOrientation = ScreenOrientation.Portrait, NoHistory = true)]

这里的重要说明是“NoHistory=True”显然使页面退出并返回到前一页。删除“NoHistory = true”有效并使其调用 OnActivityResult()。关于它的一些文档说“'true'的值意味着活动不会留下历史痕迹。它不会保留在任务的活动堆栈中,因此用户将无法返回它”所以我猜这是有道理的。

【讨论】:

以上是关于使用相机意图时未调用 OnActivityResult()?的主要内容,如果未能解决你的问题,请参考以下文章

在 viewDidLoad 外部调用方法时未显示相机胶卷中的最后一张图像

Android:调用相机意图后活动被破坏

Android:调用相机意图后活动被破坏

android方向 - 意图问题(相机)

相机意图/活动 - 避免保存到画廊

从概览屏幕恢复应用时未调用 onActivityResult(最近)