Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
#1

Сохранение фото на телефон - Android

21.07.2015, 14:11. Просмотров 844. Ответов 19
Метки нет (Все метки)

Народ, какая то фигня случилась, в общем делаю приложение, программа фоткает в фоне дефолтной камерой. Все вроде бы ок, тестировал на nexus 4, на one plus все хорошо, все сохраняет. Как только пробую на самсунгах, на любом из девайсов самсунга фотки не сохраняются, не могу понять в чем проблема, все права есть все должно быть нормально... посоветуйте что то плиз.

Код для делания фотографии
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private void takePhoto(final Context context) {
        final SurfaceView preview = new SurfaceView(context);
        SurfaceHolder holder = preview.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                showMessage("Surface created");
                Camera camera = null;
 
                try {
                    camera = Camera.open();
                    showMessage("Opened camera");
 
                    try {
                        camera.setPreviewDisplay(holder);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
 
                    camera.startPreview();
                    showMessage("Started preview");
 
                    camera.takePicture(null, null, new Camera.PictureCallback() {
 
                        @Override
                        public void onPictureTaken(byte[] data, Camera camera) {
                            showMessage("Took picture");
 
                            saveAsImage(data);
                            camera.release();
                        }
                    });
                } catch (Exception e) {
                    if (camera != null)
                        camera.release();
                    throw new RuntimeException(e);
                }
            }
 
            @Override public void surfaceDestroyed(SurfaceHolder holder) {}
            @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
        });
 
        WindowManager wm = (WindowManager)context
                .getSystemService(Context.WINDOW_SERVICE);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                1, 1,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                0,
                PixelFormat.UNKNOWN);
 
        wm.addView(preview, params);
    }


Код сохранения картинки в папку с фотками
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
 private void saveAsImage(byte[] data) {
        try {
            File cameraFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/Camera");
            if(!cameraFile.exists())
                cameraFile.mkdir();
            File outputFile = new File(cameraFile, "/image_" + randomNumber() + ".jpg");
            FileOutputStream jpg = new FileOutputStream(outputFile);
            jpg.write(data);
            jpg.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


Права
Кликните здесь для просмотра всего текста
XML
1
2
3
4
 <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera2" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


Может у кого то есть какие то идеи по этому поводу, целый день бьюсь и никак не могу понять почему на всех девайсах кроме самсунга норм, а на самсунгах ничего...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
21.07.2015, 14:24     Сохранение фото на телефон #2
соединяем телефон с компом, запускаем приложение и смотрим ошибки (если они есть)
с камерой такая беда часто случается, работает по разному на разных устройствах
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
21.07.2015, 14:32  [ТС]     Сохранение фото на телефон #3
Телефона на руках нет, ошибок не выдает, просто стопарится на Started preview и дальше не идет... Бывает идет и дальше но фотки все равно не сохраняет.
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
21.07.2015, 14:33     Сохранение фото на телефон #4
dajver, а сама фотка делается? В метод saveAsImage(byte[] data) data не null приходит?
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
21.07.2015, 14:43  [ТС]     Сохранение фото на телефон #5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
а сама фотка делается? В метод saveAsImage(byte[] data) data не null приходит?
Нету девайса на руках, если бы был я бы думаю смог разобраться, хотя кроме моих логов больше ничего не говорит... Могу только сказать что data.length не пустой. Все время разный размер, значит фотки делаются и они не пустые)
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
21.07.2015, 14:50     Сохранение фото на телефон #6
dajver, а рут есть на устройстве? Если есть можно попробовать сохранить фото в data/data и посмотреть что будет. Если сохраниться значит в сторону записи копать, если нет соответственно в сторону съемки, но это не 100% конечно. И может еще mkdir() попробовать заменить на mkdirs().
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
21.07.2015, 14:54  [ТС]     Сохранение фото на телефон #7
Цитата Сообщение от Spelcrawler Посмотреть сообщение
dajver, а рут есть на устройстве? Если есть можно попробовать сохранить фото в data/data и посмотреть что будет. Если сохраниться значит в сторону записи копать, если нет соответственно в сторону съемки, но это не 100% конечно. И может еще mkdir() попробовать заменить на mkdirs().
К сожалению рута нет... По поводу mkdirs, папка то уже такая на телефоне есть, а вот фотка туда не пишется...
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
21.07.2015, 15:04     Сохранение фото на телефон #8
Started preview - иногда требуется писать в двух местах, иногда нет
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
21.07.2015, 15:24     Сохранение фото на телефон #9
а я бы для начала с Environmen поэкспериментировал, и посмотрел бы какие пути при каких значениях предоставляет среда.
да и мб добавил бы на всякий случай
XML
1
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
21.07.2015, 16:09     Сохранение фото на телефон #10
Цитата Сообщение от androbro Посмотреть сообщение
добавил бы на всякий случай
Вроде же автоматом дается, если на запись запросить.
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
21.07.2015, 16:13  [ТС]     Сохранение фото на телефон #11
Цитата Сообщение от androbro Посмотреть сообщение
да и мб добавил бы на всякий случай
Не помогло, видать причина не в этом

а я бы для начала с Environmen поэкспериментировал, и посмотрел бы какие пути при каких значениях предоставляет среда.
Попробовал, если указывать как я указал то метод сам находит папку dcim и пишет туда... Но почему то на самсунгах вот щас получается создать папку Camera, а в ней создаются черные фотки, то есть как будто битые файлы...
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
21.07.2015, 16:18     Сохранение фото на телефон #12
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Вроде же автоматом дается, если на запись запросить.
ок, буду знать
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
21.07.2015, 17:58  [ТС]     Сохранение фото на телефон #13
Больше никаких идей нет?) Я загуглил, думал может найду какие то отличия записи файлов на самсунгах, но не нашел ничего... Файлы пишутся битые, может все таки причина в фотографии? Тогда что сделать что бы фотки фоткались не битые на самсунгах? Ведь на остальных девайсах все нормально...
Spelcrawler
525 / 495 / 111
Регистрация: 12.03.2014
Сообщений: 1,647
Завершенные тесты: 1
21.07.2015, 18:01     Сохранение фото на телефон #14
Цитата Сообщение от dajver Посмотреть сообщение
Больше никаких идей нет?
Сложно что-то придумать без устройства на руках. Раз файлы теперь пишутся - попробуйте писать размер файлов в какой нибудь текстовый файл. Можно даже писать размер до записи (размер массива байт) и после (размер уже сохраненного файла). Так уже можно будет 100% сказать в чем именно проблема и копать дальше)
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
21.07.2015, 18:03  [ТС]     Сохранение фото на телефон #15
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Сложно что-то придумать без устройства на руках. Раз файлы теперь пишутся - попробуйте писать размер файлов в какой нибудь текстовый файл. Можно даже писать размер до записи (размер массива байт) и после (размер уже сохраненного файла). Так уже можно будет 100% сказать в чем именно проблема и копать дальше)
Интересное предложение но что то мне кажется это не сильно поможет... Блин
lifestyle
Mobile Developer
231 / 227 / 4
Регистрация: 10.05.2009
Сообщений: 917
22.07.2015, 09:59     Сохранение фото на телефон #16
Попробуйте добывить строку jpg.flush();преде строко jpg.close();
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
22.07.2015, 17:53  [ТС]     Сохранение фото на телефон #17
Получил девайс на руки, в общем оказывается что файлы битые создаются, именно на самсунгах... Не понятно почему.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void saveAsImage(byte[] data) {
        int random = randomNumber();
        try {
            File cameraFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/Camera");
            if(!cameraFile.exists())
                cameraFile.mkdirs();
            File outputFile = new File(cameraFile, "/image_" + random + ".jpg");
 
            Log.e("", outputFile.getAbsolutePath());
            SharedPrefs.setImagePath(getApplicationContext(), outputFile.getAbsolutePath());
 
            FileOutputStream jpg = new FileOutputStream(outputFile);
            jpg.write(data);
            jpg.flush();
            jpg.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
На остальных девайсах все хорошо, почему то именно на самсунгах не работает... Ссылку показывает /storage/emulated/0/DCIM/image_1879504572.jpg, перехожу по этому адресу, а там битая картинка...

Добавлено через 20 минут
В общем вот какие дела, если вот так:
Java
1
camera.takePicture(null, null, raw);
то никакие файлы не создаются и оно даже не заходит в takePictureCalBack

если же вот так
Java
1
camera.takePicture(null, raw, null);
То файл создается но картинка не картинка, типа битый... Я не знаю че делать. Хееелп

raw - это колбек который сохраняет картинку, в ней вызывается метод saveAsImage().
androbro
323 / 283 / 59
Регистрация: 17.10.2014
Сообщений: 835
22.07.2015, 17:57     Сохранение фото на телефон #18
Цитата Сообщение от dajver Посмотреть сообщение
raw - это колбек который сохраняет картинку, в ней вызывается метод saveAsImage().
а мне казалось что raw эт сырой формат.
вот может в этом и причина что Вы пытаетесь его сохранить как .jpg
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
22.07.2015, 18:02  [ТС]     Сохранение фото на телефон #19
Вот он этот колбекк
Java
1
2
3
4
5
6
7
8
9
10
Camera.PictureCallback raw = new Camera.PictureCallback(){
 
        @Override
        public void onPictureTaken(byte[] arg0, Camera arg1) {
            saveAsImage(arg0);
            arg1.release();
 
            showMessage("Tooked picture");
        }
    };
Цитата Сообщение от androbro Посмотреть сообщение
вот может в этом и причина что Вы пытаетесь его сохранить как .jpg
Попробовал в png, тоже самое, это не из за формата, просто не заходит в колбек...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 08:19     Сохранение фото на телефон
Еще ссылки по теме:

Эмулятор VS телефон Android
Программа не видит телефон Android
Android Телефон в качестве ПУ для Arduino
Android Студия не видит телефон
Android Реализовать распознавание текста на фото и его сохранение

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 729
23.07.2015, 08:19     Сохранение фото на телефон #20
Цитата Сообщение от androbro Посмотреть сообщение
Цитата Сообщение от dajver Посмотреть сообщение
raw - это колбек который сохраняет картинку, в ней вызывается метод saveAsImage().
а мне казалось что raw эт сырой формат.
вот может в этом и причина что Вы пытаетесь его сохранить как .jpg
как сказал один умный чел никто не знает как будет вести себя java если переменные или методы называть
raw, jpg, public, create, takePicture и т.д.
Yandex
Объявления
23.07.2015, 08:19     Сохранение фото на телефон
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru