14

这段代码曾经可以工作,但在 Android 4.2 和 OpenCV 2.4.4 上它失败了,但我不知道为什么。任何人都可以为我阐明它吗?

谢谢你的帮助。

巴兹

public void SaveImage (Mat mat) {
  Mat mIntermediateMat = new Mat();

  Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3);

  File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  String filename = "barry.png";
  File file = new File(path, filename);

  Boolean bool = null;
  filename = file.toString();
  bool = Highgui.imwrite(filename, mIntermediateMat);

  if (bool == true)
    Log.d(TAG, "SUCCESS writing image to external storage");
  else
    Log.d(TAG, "Fail writing image to external storage");
  }

bool 每次都返回 false。用户 #0 的文件路径/名称应该是(“storage/emulated/0/Pictures/barry.png”),并且目录 Pictures 在那里。

什么可以使 imwrite 返回 false?

我可以将垫子转换为 bmp 并自己保存(我在非 OpenCV 应用程序的其他地方这样做)但是因为 Highgui.imwrite 在那里,并且当我写入 2.4.0 并在 Android 上测试时,这段代码曾经可以工作3.x,如果可以的话,我想使用它。

非常感谢

巴兹

4

4 回答 4

19

我不敢相信。[捂脸]。

将此添加到您的清单文件 Barry:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

请问有人过来打我一巴掌吗?我设法从清单中删除了写权限,所以它不会写真的应该不足为奇......

多哈。

巴里

于 2013-03-14T11:13:01.180 回答
5

实际上有两个可能的问题:

  1. 安卓权限。要解决此问题,请将权限添加到清单

    “android.permission.WRITE_EXTERNAL_STORAGE”

  2. 您正在尝试将文件保存到 SD 卡,并且您的设备以“磁盘驱动器”模式连接到 PC。这意味着您与 PC 共享访问权限。在“仅充电”模式下连接您的设备。要检查连接模式,请使用

    Environment.getExternalStorageState(),它将 为“磁盘模式”返回共享并为“仅充电”安装

    我修改了你的代码,现在看起来像

    public void SaveImage (Mat mat) {
       Mat mIntermediateMat = new Mat();
       Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3);
    
       File path = new File(Environment.getExternalStorageDirectory() + "/Images/");
       path.mkdirs();
       File file = new File(path, "image.png");
    
       filename = file.toString();
       Boolean bool = Highgui.imwrite(filename, mIntermediateMat);
    
       if (bool)
        Log.i(TAG, "SUCCESS writing image to external storage");
       else
        Log.i(TAG, "Fail writing image to external storage");
    }
    
于 2013-06-11T12:33:37.907 回答
0

请注意版本 +4.4 (KitKat),因为android.permission.WRITE_EXTERNAL_STORAGE不允许在外部 SD 卡上写入:

WRITE_EXTERNAL_STORAGE 权限只能授予对设备上主要外部存储的写访问权限。不允许应用程序写入辅助外部存储设备,除非在合成权限允许的特定包目录中。以这种方式限制写入可确保系统可以在卸载应用程序时清理文件。

看看:写入 SD 卡总是失败

于 2016-05-10T14:19:54.970 回答
0

从安卓 6+

从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时...

你需要添加类似的东西:

  if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
  {
        ActivityCompat.requestPermissions(
                this,
                new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
                PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
  }

https://developer.android.com/training/permissions/requesting.html

于 2017-11-02T14:34:28.547 回答