Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как сохранить фото с камеры напрямую во внутреннюю директорию приложения?

Стартую Intent камеры, добавляю Extra с Uri файла, куда надо сохранить снимок:

Java
1
2
3
4
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        Uri uriFotoFile = Uri.fromFile(getInternalFotoPath());
        intent.putExtra(MediaStore.EXTRA_OUTPUT,uriFotoFile);
        startActivityForResult(intent,REQUEST_TAKE_PHOTO);
Методом getInternalFotoPath() формирую файл куда надо записать результат:
Java
1
2
3
4
5
private File getInternalFotoPath(){
        File internalFilesDir = getFilesDir();
        File file = new File(internalFilesDir,"test_foto.jpg");
        return file;
    }
В onActivityResult смотрю что там вообще есть, во внутренней деректории приложения:
Java
1
2
3
4
5
6
7
8
9
10
11
12
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case REQUEST_TAKE_PHOTO:
                toLog("Получили фото. Содержимое внутренней директории приложения");
                for (File file : getFilesDir().listFiles()) {
                 toLog(file.getName());
                }
                break;
        }
    }
И всё, зависаю на камере. Т.е. камера стартует, делаю снимок и далее по нажатию "Ок" так и остаюсь висеть в камере. Могу вернуться назад и всё.

Если заменить Uri файла на сам файл, т.е. добавлять Extras так:
Java
1
intent.putExtra(MediaStore.EXTRA_OUTPUT,getInternalFotoPath());
Никакой ошибки не происходит, из фото нормально выхожу, но файла во внутренней директории нет.

Могу получить снимок в External Storage и потом уже перекинуть файл в Internal. Но это кажется таким велосипедом. Если Intent на получения фотографии может легко писать в getExternalFilesDir(Environment.DIRECTORY_PICTURES) (в ту часть, куда так же не нужны права в манифесте
XML
1
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
то и сразу в Internal наверное как-то же можно?
Ответ: arvalon, в интернал камера не может писать - сам пробовал это провернуть и где-то читал что не может - где к сожалению не запомнил
Вопрос: приложение для ip камеры (найтисоздатьпередалть)

здравствуйте нужна приложения для моб устроиств андроид и ios которая позволила бы просматривать видео с ип камеры (vstarcam c7824wip)
приложение которое шло в комплект Eye4 работает только во вннутренной сети то есть если телефон подключен к другой wifi или Моб Интернет то связь с камерой невозможна

так же сейчас единствельная программа которую нашел на PlayMarket это VsCam которая меня устраивает и работает даже когда телефон в другой сети интернета Но проблема в том что в этой приложение есть возможность изменить пароль от камеры, включить выключить микрофон, и поворачивать камерой и эти функции мне НЕ НУЖНЫ!

(так как камера установлена на парковке и я хочу предоставить доступ всем водителей но не хочу чтобы один из них случайно поменял пароль и остальные потеряют доступ к камере или же один из них повернет камеру в небо и остальные не будут видеть свои машины )

а сейчас задача:
1- найти программу которая работает без всяких возможностей которые мне не нужны и я написал их выше
2- взять VsCam и переделать ее как мне нужно ( то есть убрать то что лишнее)
3- создать заного простую программу с возможностью только просмотра онлайн видео с камеры)
Ответ: где это сделать? опция замены пароля из моб приложения SvCam меняет пароль админа от камеры и перезагружает ее(
Вопрос: Не удаётся проинициализировать камеру

Коллеги,пытаясь создать кастомную камеру столкнулся со следующей проблемой:
при попытке получить доступ к камере в методе
Код Java(TM) 2 Platform Standard Edition 5.0
1
camera = Camera.open(CAMERA_ID);
выбрасывается исключение java.lang.RuntimeException: Fail to connect to camera service, таким образом объект camera принимает значение null и в дальнейшем с ним нельзя работать.
Результат гугления говорит только о том, что в AndroidManifest должны быть указаны соответствующие для камеры разрешения:
Код XML
1
2
3
4
5
    
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
Все эти разрешения у меня есть, экспериментировал с ними, но проблему это не решило.
Код Java(TM) 2 Platform Standard Edition 5.0
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
Ниже приведён полный код моего класса с камерой.Может быть кто-то подскажет в чём я накосячил?
 
public class CustomCamera extends Activity {
 
    /** Виджет для предпросмотра фотографий */
    SurfaceView sv;
    /** Адаптер для SurfaceView */
    SurfaceHolder holder;
    /** Объект для получения информации об изменениях в surface */
    HolderCallback holderCallback;
    /** Объект для доступа к камере */
    static Camera camera = null;
    /** Наличие камеры */
    private boolean hasCamera = false;
    Button shotButton;
 
    final int CAMERA_ID = 0;
    final boolean FULL_SCREEN = true;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
 
        // Без заголовка
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // Полноэкранный режим
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        // Устанавливаю разметку
        setContentView(R.layout.custom_camera_activity2);
 
        shotButton = (Button) findViewById(R.id.btnTakePicture);
        shotButton.setOnClickListener(new View.OnClickListener() {
            // Отправляем изображение при нажатии на кнопку сфотографировать
            @Override
            public void onClick(View v) {
                if (hasCamera) {
                    camera.takePicture(null, null, new Camera.PictureCallback() {
                        @Override
                        public void onPictureTaken(byte[] data, Camera camera) {
                            try {
                                Intent intent = new Intent();
                                intent.putExtra("data", data);
                                setResult(RESULT_OK, intent);
                                finish();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                }
            }
        });
 
        // Инициализирую виджет для предпросмотра
        sv = (SurfaceView) findViewById(R.id.surfaceView);
        // Получаю адаптер для виджета предпросмотра
        holder = sv.getHolder();
        // Устанавливаю тип адаптера
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 
        holderCallback = new HolderCallback();
 
        // Узнаём количество камер
        int numCameras = Camera.getNumberOfCameras();
        if (numCameras > 0) {
            hasCamera = true;
        }
 
        holder.addCallback(holderCallback);
    }
 
    // Обработка повторного включения камеры
    @Override
    protected void onResume() {
 
        super.onResume();
        // Если есть камера
        if (hasCamera) {
            // Получаем доступ к камере
            try {
                camera = Camera.open(CAMERA_ID);
                // Настраиваем размер surface
                setPreviewSize(FULL_SCREEN);
            } catch (Exception e) {
                e.printStackTrace();
                Log.d(Constant.DEBUG_TAG, "Не удалось получить доступ к камере");
            }
        } else {
            Toast.makeText(this, "В устройстве отсутствует камера", Toast.LENGTH_SHORT).show();
            Log.d(Constant.DEBUG_TAG, "В устройстве отсутствует камера");
        }
    }
 
    // Обработка выключения камеры
    @Override
    protected void onPause() {
 
        super.onPause();
        if (camera != null) {
            // Останавливаем предпросмотр
            camera.stopPreview();
            // Освобождаем камеру для использования другими приложениями
            camera.release();
        }
        camera = null;
    }
 
    class HolderCallback implements SurfaceHolder.Callback {
 
        // Начало трансляции изображения
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
 
            try {
                // Подключаем камеру к адаптеру предпросмотра
                camera.setPreviewDisplay(holder);
                // Запускаем камеру
                camera.startPreview();
            } catch (NullPointerException npe) {
                npe.printStackTrace();
                Log.d(Constant.DEBUG_TAG, "Объект camera не проинициализирован в методе onResume");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        // Был изменен формат или размер surface
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 
            try {
            // Останавливаем камеру
            camera.stopPreview();
            // Настраиваем камеру с учетом поворота устройства
            setCameraDisplayOrientation(CAMERA_ID);
                // Подключаем камеру к адаптеру предпросмотра
                camera.setPreviewDisplay(holder);
                // Запускаем камеру
                camera.startPreview();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 
        // surface более недоступен
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }
    }
 
    // Определяем размеры surface с учетом экрана и изображения с камеры
    void setPreviewSize(boolean fullScreen) {
 
        // Получаем размеры экрана
        Display display = getWindowManager().getDefaultDisplay();
        boolean widthIsMax = display.getWidth() > display.getHeight();
 
        // Определяем размеры превью камеры
        Size size = camera.getParameters().getPreviewSize();
 
        RectF rectDisplay = new RectF();
        RectF rectPreview = new RectF();
 
        // RectF экрана, соотвествует размерам экрана
        rectDisplay.set(0, 0, display.getWidth(), display.getHeight());
 
        // RectF первью
        if (widthIsMax) {
            // Превью в горизонтальной ориентации
            rectPreview.set(0, 0, size.width, size.height);
        } else {
            // Превью в вертикальной ориентации
            rectPreview.set(0, 0, size.height, size.width);
        }
 
        Matrix matrix = new Matrix();
        // Подготовка матрицы преобразования
        if (!fullScreen) {
            // Если превью будет "втиснут" в экран (второй вариант из урока)
            matrix.setRectToRect(rectPreview, rectDisplay,
                    Matrix.ScaleToFit.START);
        } else {
            // если экран будет "втиснут" в превью (третий вариант из урока)
            matrix.setRectToRect(rectDisplay, rectPreview,
                    Matrix.ScaleToFit.START);
            matrix.invert(matrix);
        }
        // преобразование
        matrix.mapRect(rectPreview);
 
        // установка размеров surface из получившегося преобразования
        sv.getLayoutParams().height = (int) (rectPreview.bottom);
        sv.getLayoutParams().width = (int) (rectPreview.right);
    }
 
    // Устанавливаем ориентацию предпросмотра
    void setCameraDisplayOrientation(int cameraId) {
        // определяем насколько повернут экран от нормального положения
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int degrees = 0;
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
        }
 
        int result = 0;
 
        // Получаем инфо по камере cameraId
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(cameraId, info);
 
        // Задняя камера
        if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
            result = ((360 - degrees) + info.orientation);
        } else
            // передняя камера
            if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
                result = ((360 - degrees) - info.orientation);
                result += 360;
            }
        result = result % 360;
        camera.setDisplayOrientation(result);
    }
}
Ответ: Паблито, у меня та же тема. Проверял на Android 5 - всё работает. Взял устройство с Android 2.3.3, перезагружал - не работает. Вот так ещё бывает.

Добавлено через 1 час 14 минут
Короче, тема такая. По многочисленным сообщениям с SO камера некорректно работает в портретном режиме. Запустил в пейзажном - заработало.

Добавлено через 45 минут
Ну это уже смешно. Запускаешь в пейзажном, крутишь устройство - всё работает, пока не станет в портретном. Дальше изображение подвисает. Затем снова работает, когда крутишь дальше. Когда устройство становится "вверх ногами", изображение может неожиданно перевернуться зеркально.

Добавлено через 56 секунд
Не зря задание состоит в поиске багов. Авторы топиков на SO и не знали, сколько их можно словить.
Вопрос: Обрезать фото и вывести на экран приложения

Всем привет!
Друзья, поделитесь кусочком кода, в котором можно сделать фото, обрезать его до нужных размеров (например, 720х720) и вывести на экран приложения.

Я попробовал изменить размеры через createScaledBitmap(), но он мне просто вытянул маленькое изображение. И я получил изображение 720х720, но все в квадратиках.

Вот мой код:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Щелчок кнопки
    public void CameraTurnClick(View v) {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_RESULT);
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_RESULT) {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            int dstWidth=320;
            int dstHeight=640;
           thumbnail= Bitmap.createScaledBitmap(thumbnail, dstWidth, dstHeight, false);
 
            ivCamera.setImageBitmap(thumbnail);
        }
    }
Ответ: Novichek_9I, не знаю, не изучал вопрос(
Вопрос: Меню выбора на фоне запущенной камеры при старте приложения?

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

P.S. Пробовал запускать диалог с листом после запуска камеры, а камера все равно на переднем плане и диалога не видно.
Ответ: bastrakov,
а вдруг Вы там каверзу какую сотворите, а все будут думать, что это камера виновата! :-)
Да мне нужно тупо (ну при помощи меню) при запуске приложения указать этой камере куда фото покласть. А т.к. приложение камеры запускается далеко не мгновенно, вот и подумал почему бы ей не запуститься заранее пока юзер выбирает место сохранения
Вопрос: Управление камерой на OS Android

Ребята всем привет!

Хочу разработать похожую инсталляцию:


Программирую давно не с разработкой мобильных приложения не связывался.

Написать грамотное ПО, которое могло бы брать уже готовые фото и склеивать их них итоговое видео, а так же чтоб экран был тачскрин вполне реально.

Но вся загвоздка в том чтоб по команде сделать фото на всех мобильных устройствах одновременно, а так же передать данные фото на компьютер, который будет их потом соединять и делать видео 360 для меня куда сложнее и не понятно.

Подскажите как управлять фото камерой телефона посылая команды с компа на фото, как получить сделанные фото или видео с телефона на комп, какие протоколы связи использовать, как по вашему реализовывался данный проект и с чего начать?

Спасибо!
Ответ: Добрый день @Valakin
Вы наверное не со всем поняли мою задачу.
Вот еще один пример:
Вопрос: Передача фото по сети на сервер

У меня такая задача : нужно реализовать такое приложение чтобы водитель мог сфотографировать на улице обьект здание и тп и фото этого обьекта загружалось в приложение и дальше передавалось с шифрованием на заданный сервер. Ну фото с камеры получить в приложении я смогу. Вопрос какой в данному случае лучше использовать протокол для передачи данных но так чтобы и клиент и сервер можно было написать на джаве (Клиент точно только на джаве там андроид а сервер можно на Си ++ написать, но http не подходит сервер на JavaScript надо писать)?? Думал на счет TCP но там вроде порт нужно пробрасывать если не по лакальной сети передаешь. Какой протокол посоветуете вы?? И какие библиотеки для шифрования данных использовать?? Посоветуйте пожалуйста
Ответ: спасибо всем
Вопрос: Приложение Camera ругается на отсутствие SD карты

Возникла следующая проблема.Есть кнопка,при нажатии на которую происходит переход в приложение Camera.После того как будет сделана фотография,снимок должен установиться в ImageView.
Однако в моём случае не удаётся сделать фотографию поскольку приложение Camera ругается на то что отсутствует SD карта.
Если SD карту вставить,то всё отрабатывает корректно.
Скажите как можно обойти эту проблему, с учётом того,что мне не нужно сохранять фото ни на внутреннюю,ни на внешнюю память, нужно лишь сделать фото,установить его в ImageView,откуда затем фотография отправится на сервер.
Ответ: Так и поступил,но столкнулся вот с такой проблемой
Вопрос: Как добавить в приложение просмотр потока с камеры видеонаблюдения?

Здравствуйте!

есть видеорегистратор аналоговой системы видеонаблюдения(доступен через интернет), к нему подключены 3 камеры, задача:

1. подключиться по ip-адресу и порту к видеорегистратору.

2. взять поток нужной камеры и отобразить в приложении.

есть похожее приложение
я в нем заполняю 5 полей: adress, port, login, password, max channel и все работает,

подскажите кто сталкивался, что использовать для подключения, и как можно это реализовать?


Спасибо!
Ответ: _Night_Scream_, да, вроде то что надо...

правда сделал по видеоуроку, не работает пока и не выдает ошибок,... просто висит ProgressDialog.

а в RTSPplayer вкидываю свою ссылку все работает отлично..., буду разбираться.

Добавлено через 9 минут
ВСЕ ОТЛИЧНО РАБОТАЕТ - из примера, адрес с опечаткой вбил,.. спасибо всем огромное!
Вопрос: Прикрепление к письму фотографии из камеры

В приложении есть три текстовых поля EditText: электронный адрес, тема письма, сам текст. По нажатию кнопки ниже письмо с помощью emailIntent.putExtra отправляется, например, в Gmail. Потом пользователь в самом Gmail просто нажимает отправить письмо. Нужно по такому же принципу прикреплять к письму фотографию, сделанную стандартной камерой, не выходя из приложения. Как это реализовать?
Ответ: Какой код, нет никакого кода