Intereting Posts
Выполнение и мониторинг телефонного звонка в телефоне Android: простой способ сделать геозонность? Это тестовый заказ, с которого вы не будете платить Как решить CursorIndexOutOfBoundsException Как отправить ключевые события в безгласный эмулятор в контрольно-измерительном тесте? Как добавить кнопку на MapView android Характеристики SD-карты Android на Samsung Galaxy «Предварительный просмотр затухает при рендеринге бесконечного цикла макета или неограниченной рекурсии», когда я дублировал некоторые TableRows Я не могу заставить IntelliJ распознать свой Android SDK Запустить анимацию при загрузке страницы, остановить загрузку страницы «Tel», «sms» и «mailto» больше не работают в Android после обновления до кордовы 3.6.3 Почему сотни растровых изображений в памяти для основного приложения для Android? Запятая клавиатура Samsung не отображается Как программно подключить 2 устройства Android с Bluetooth? Как читать числа и текст с камеры в Android?

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-карту всегда сбой