Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
#1

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

21.07.2015, 14:11. Просмотров 1048. Ответов 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" />


Может у кого то есть какие то идеи по этому поводу, целый день бьюсь и никак не могу понять почему на всех девайсах кроме самсунга норм, а на самсунгах ничего...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2015, 14:11
Ответы с готовыми решениями:

Сохранение фото в базу данных
Ребят помогите пожалуйста ! Суть такова есть Activity в ней EditText,...

Camera, сохранение пути к фото
Как получить полный путь к фото, сделанного камерой? @Override public void...

Реализовать распознавание текста на фото и его сохранение
Доброго времени суток! В своей профессиональной деятельности столкнулся с...

Сохранение и восстановление позиции фото при перемещении через ObjectAnimator до и после паузы
Дано - ObjectAnimator, imageView. ImageView с фотографией должен переместится...

Копьютерный интернет + телефон (фото присутствует)
Добрый день. Искал инфу на многих сайтах,но нарывался только на Англо...

19
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 738
21.07.2015, 14:24 #2
соединяем телефон с компом, запускаем приложение и смотрим ошибки (если они есть)
с камерой такая беда часто случается, работает по разному на разных устройствах
1
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
21.07.2015, 14:32  [ТС] #3
Телефона на руках нет, ошибок не выдает, просто стопарится на Started preview и дальше не идет... Бывает идет и дальше но фотки все равно не сохраняет.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
21.07.2015, 14:33 #4
dajver, а сама фотка делается? В метод saveAsImage(byte[] data) data не null приходит?
1
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
21.07.2015, 14:43  [ТС] #5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
а сама фотка делается? В метод saveAsImage(byte[] data) data не null приходит?
Нету девайса на руках, если бы был я бы думаю смог разобраться, хотя кроме моих логов больше ничего не говорит... Могу только сказать что data.length не пустой. Все время разный размер, значит фотки делаются и они не пустые)
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
21.07.2015, 14:50 #6
dajver, а рут есть на устройстве? Если есть можно попробовать сохранить фото в data/data и посмотреть что будет. Если сохраниться значит в сторону записи копать, если нет соответственно в сторону съемки, но это не 100% конечно. И может еще mkdir() попробовать заменить на mkdirs().
1
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
21.07.2015, 14:54  [ТС] #7
Цитата Сообщение от Spelcrawler Посмотреть сообщение
dajver, а рут есть на устройстве? Если есть можно попробовать сохранить фото в data/data и посмотреть что будет. Если сохраниться значит в сторону записи копать, если нет соответственно в сторону съемки, но это не 100% конечно. И может еще mkdir() попробовать заменить на mkdirs().
К сожалению рута нет... По поводу mkdirs, папка то уже такая на телефоне есть, а вот фотка туда не пишется...
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 738
21.07.2015, 15:04 #8
Started preview - иногда требуется писать в двух местах, иногда нет
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 897
21.07.2015, 15:24 #9
а я бы для начала с Environmen поэкспериментировал, и посмотрел бы какие пути при каких значениях предоставляет среда.
да и мб добавил бы на всякий случай
XML
1
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
1
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
21.07.2015, 16:09 #10
Цитата Сообщение от androbro Посмотреть сообщение
добавил бы на всякий случай
Вроде же автоматом дается, если на запись запросить.
2
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
21.07.2015, 16:13  [ТС] #11
Цитата Сообщение от androbro Посмотреть сообщение
да и мб добавил бы на всякий случай
Не помогло, видать причина не в этом

а я бы для начала с Environmen поэкспериментировал, и посмотрел бы какие пути при каких значениях предоставляет среда.
Попробовал, если указывать как я указал то метод сам находит папку dcim и пишет туда... Но почему то на самсунгах вот щас получается создать папку Camera, а в ней создаются черные фотки, то есть как будто битые файлы...
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 897
21.07.2015, 16:18 #12
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Вроде же автоматом дается, если на запись запросить.
ок, буду знать
0
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
21.07.2015, 17:58  [ТС] #13
Больше никаких идей нет?) Я загуглил, думал может найду какие то отличия записи файлов на самсунгах, но не нашел ничего... Файлы пишутся битые, может все таки причина в фотографии? Тогда что сделать что бы фотки фоткались не битые на самсунгах? Ведь на остальных девайсах все нормально...
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
21.07.2015, 18:01 #14
Цитата Сообщение от dajver Посмотреть сообщение
Больше никаких идей нет?
Сложно что-то придумать без устройства на руках. Раз файлы теперь пишутся - попробуйте писать размер файлов в какой нибудь текстовый файл. Можно даже писать размер до записи (размер массива байт) и после (размер уже сохраненного файла). Так уже можно будет 100% сказать в чем именно проблема и копать дальше)
1
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
21.07.2015, 18:03  [ТС] #15
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Сложно что-то придумать без устройства на руках. Раз файлы теперь пишутся - попробуйте писать размер файлов в какой нибудь текстовый файл. Можно даже писать размер до записи (размер массива байт) и после (размер уже сохраненного файла). Так уже можно будет 100% сказать в чем именно проблема и копать дальше)
Интересное предложение но что то мне кажется это не сильно поможет... Блин
0
lifestyle
Mobile Developer
234 / 230 / 18
Регистрация: 10.05.2009
Сообщений: 917
22.07.2015, 09:59 #16
Попробуйте добывить строку jpg.flush();преде строко jpg.close();
1
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
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().
0
androbro
343 / 303 / 68
Регистрация: 17.10.2014
Сообщений: 897
22.07.2015, 17:57 #18
Цитата Сообщение от dajver Посмотреть сообщение
raw - это колбек который сохраняет картинку, в ней вызывается метод saveAsImage().
а мне казалось что raw эт сырой формат.
вот может в этом и причина что Вы пытаетесь его сохранить как .jpg
1
dajver
410 / 274 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
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, тоже самое, это не из за формата, просто не заходит в колбек...
0
Valakin
431 / 97 / 15
Регистрация: 21.02.2015
Сообщений: 738
23.07.2015, 08:19 #20
Цитата Сообщение от androbro Посмотреть сообщение
Цитата Сообщение от dajver Посмотреть сообщение
raw - это колбек который сохраняет картинку, в ней вызывается метод saveAsImage().
а мне казалось что raw эт сырой формат.
вот может в этом и причина что Вы пытаетесь его сохранить как .jpg
как сказал один умный чел никто не знает как будет вести себя java если переменные или методы называть
raw, jpg, public, create, takePicture и т.д.
0
23.07.2015, 08:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2015, 08:19

Сохранение картинки на телефон
Как создать функцию ,что бы после нажатия button картинка сохранилась на...

Сохранение пропорций в фото
Доброго Времени Суток! Я пишу программку показывающую фото на StringGrid. И...

Сохранение фото в файл
В теге img хранится изображение из canvas. Как сохранить картинку в файл или...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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