Intereting Posts
Разработать видеопроигрыватель на Android для поддержки HLS Android L Preview не ищет собственные библиотеки в папке «armeabi» (UnsatisfiedLinkError) Отправка параметра android.content.Context для функции с JNI Обработка аннотации Kotlin игнорирует элементы с похожими именами Как я могу получить отпечаток MD5 от keytool от Java, а не только SHA-1? Использует ли Android OSHttp внутри? Как использовать SortedList в RecyclerView с библиотекой привязки данных Android? Textview с длинным текстом выталкивает другие виды в GridLayout, несмотря на то, что ellipsize = end Утилита Android SDK для установки в Docker не работает Как получить прозрачный фон версии webView for 4.0 Изменения кода не отражены в .apk Драйверы «мягкого режима» для Android-хоста Android USB для стандартных USB-устройств, совместимых со стандартами Как сделать что-то после того, как пользователь нажмет на меня EditText Инструмент Android для создания селектора xml для кнопок Перемещение маркера между 2 координатами по направлениям движения

Android: OpenCV: imwrite всегда возвращает false и не записывает

Этот код работал, но на Android 4.2 и OpenCV 2.4.4 он терпит неудачу, но я не знаю почему. Может ли кто-нибудь пролить свет на это для меня?

Спасибо за любую помощь.

Baz

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 каждый раз. Путь / имя файла так же, как и должно быть («storage / emulated / 0 / Pictures / barry.png») для пользователя № 0, а также каталог «Картинки».

Что может заставить imwrite вернуть false?

Я мог бы преобразовать коврик в bmp и сохранить его сам (что я делаю в другом месте в приложении, отличном от OpenCV), но так как Highgui.imwrite есть, и этот код работал, когда я писал на 2.4.0 и тестировал на Android 3.x, я бы хотел использовать его, если смогу.

Большое спасибо

Baz

Solutions Collecting From Web of "Android: OpenCV: imwrite всегда возвращает false и не записывает"

Я не могу в это поверить. [Facepalm].

Добавьте это в свой файл манифеста Barry:

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

Кто-нибудь придет и похлопает меня, пожалуйста? Мне удалось удалить разрешение записи из манифеста, так что не должно быть никаких сюрпризов, что он не будет писать …

Doh.

Барри

На самом деле есть две возможные проблемы:

  1. Android-разрешения. Чтобы устранить эту проблему, добавьте разрешение манифеста

    "Android.permission.WRITE_EXTERNAL_STORAGE"

  2. Вы пытаетесь сохранить файл на SD-карту, и ваше устройство подключено к ПК в режиме «Дисковод». Это означает, что вы разделяете права доступа с ПК. Подключите устройство в режиме «Только заряд». Для проверки режима подключения используйте

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

Будьте осторожны с версиями +4.4 (KitKat), потому что android.permission.WRITE_EXTERNAL_STORAGE не позволяет записывать на внешнюю SD-карту:

Разрешение WRITE_EXTERNAL_STORAGE должно предоставлять только доступ на запись к основному внешнему хранилищу на устройстве. Приложениям не разрешается записывать на внешние внешние устройства хранения, за исключением их каталогов, специфичных для пакета, которые разрешены с помощью синтезированных разрешений. Ограничение записи таким образом гарантирует, что система может очищать файлы, когда приложения удаляются.

Взгляните на: Запись на SD-карту всегда сбой