Intereting Posts
Использование глобальной обработки исключений с помощью «setUncaughtExceptionHandler» и «Toast» Значок Android FAB plus не присутствует на android drawable Android-студия: почему minSdkVersion и targetSdkVersion указаны как в AndroidManifest.xml, так и build.gradle? Анимация на вкладке Viewpager изменит fadein / fadeout как на экране ввода Linkedin Поймал исключение RuntimeException из реализации заглушки связующего, когда данные swap в arrayadapter Обнаруживает ли Android-устройство телефон или планшет с javascript Доступ к камере через OpenMAX в Android Отключить фоновый эффект на ProgressDialog / AlertDialog в Android Как я могу наложить собственный вид поверх CordovaWebView PhoneGap на Android? Really Prefer Network: выберите мой собственный сетевой провайдер, как только он станет доступен (из кода) Как создать общую библиотеку в Android Поделитесь идентификатором приложения Facebook в приложениях Android Unsatisfiedlinkerror с обновлением Android 5.0.1 Использование контекста для запуска другой операции Как получить направление текста в 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-карту всегда сбой