Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: camera + navigation

Хотел спросить. Нам нужно сделать что то похожее на  (чтобы камера записывала продвижение и дополнительно была бы навигация). Какой сервис для навигации используют такие аппсы ? Google map платный. Какие есть варианты?
Ответ:
Хотел спросить. Нам нужно сделать что то похожее на  (чтобы камера записывала продвижение и дополнительно была бы навигация). Какой сервис для навигации используют такие аппсы ? Google map платный. Какие есть варианты?
Вопрос: Смена activity в Navigation Drawer

Буду в очередной раз оправдывать свой ник.

Суть вопроса - распишите по полочкам как сменить activity.

В Android Studio создаю стандартный проект с Navigation Drawer.

Создаю класс Edit (соответственно создается activity_edit.xml в res/layout/). В activity_edit.xml прописываю в заголовке android:id="@+id/activity_edit". Еще добавляю туда две кнопки (им так же прописываю id).

Теперь в MainActivity.class в секцию if else дописываю:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
 
        if (id == R.id.Operations) {
            // Handle the camera action
        } else if (id == R.id.Reports) {
 
        } else if (id == R.id.Settings) {
            setContentView(R.layout.activity_edit);
        } else if (id == R.id.About) {
 
        }
 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
В итоге при нажатии на пункт Settings на телефоне\эмуляторе получаю ошибку

E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at com.lexfall.purse.MainWindow.onNavigationItemSelected(MainActivity.java:85)


Соответственно ругается на 85 строку, а именно

Java
1
        drawer.closeDrawer(GravityCompat.START);
Подскажите в чем дело?

P.S. Без фрагментов. Интересует почему у меня не получается просто заменить одно activity на другое и как всё же надо сплясать с бубном что бы нормально всё работало.
Ответ: Ок, спасибо.
Вопрос: Custom Camera. Растянутое изображение

Сделал кастомную камеру,но столкнулся с проблемой: в режиме предпросмотра в портретном режиме изображение получается вытянутым по вертикали, а в горизонтальном режиме растянутым по горизонтали.
Пожалуйста,подскажите,что в моём коде не так?)

Код камеры:

Код 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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
import android.app.Activity;
import android.content.Intent;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.io.IOException;
import android.hardware.Camera.Size;
import android.widget.Button;
import android.widget.Toast;
import ru.oavdo.alfabank.alfacareer.R;
import ru.oavdo.alfabank.alfacareer.util.Constant;
 
public class CustomCamera extends Activity {
 
    /** Виджет для предпросмотра фотографий */
    SurfaceView sv;
    /** Адаптер для SurfaceView */
    SurfaceHolder holder;
    /** Объект для получения информации об изменениях в surface */
    HolderCallback holderCallback;
    /** Объект для доступа к камере */
    static Camera camera = null;
    /** Наличие камеры */
    private boolean hasCamera = false;
    Button shotButton;
 
    int CAMERA_ID = 0;
    final boolean FULL_SCREEN = true;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
 
        // Без заголовка
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // Горизонтальный режим
        // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        // Полноэкранный режим
        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) {
                try {
                    camera.autoFocus(new Camera.AutoFocusCallback() {
                        // Фокусируемся
                        @Override
                        public void onAutoFocus(boolean success, Camera camera) {
                            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();
                                    }
                                }
                            });
                        }
                    });
                } catch (NullPointerException ex) {
                    ex.printStackTrace();
                    finish();
                }
            }
        });
 
        // Инициализирую виджет для предпросмотра
        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) {
            switch (numCameras) {
                case 1:
                    CAMERA_ID = 0;
                    break;
                case 2:
                    CAMERA_ID = 1;
                    break;
            }
            hasCamera = true;
        } else {
            hasCamera = false;
        }
        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 ex) {
                ex.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
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraId, info);
 
        // Задняя камера
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
            result = ((360 - degrees) + info.orientation);
        } else
            // передняя камера
            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                result = ((360 - degrees) - info.orientation);
                result += 360;
            }
        result = result % 360;
        camera.setDisplayOrientation(result);
 
        // Задаём параметры отображения полученной фотографии
        Camera.Parameters parameters = camera.getParameters();
        int rotate = (degrees + 270) % 360;
        parameters.setRotation(rotate);
        camera.setParameters(parameters);
    }
}
Layout для камеры:

Код XML
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/cameraLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">
    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true">
    </SurfaceView>
 
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnTakePicture"
        android:layout_alignBottom="@+id/surfaceView"
        android:layout_centerHorizontal="true"
        android:text="@string/take_picture" />
</RelativeLayout>
Ответ: Ок,спасибо!
Вопрос: Fail to connect to camera service

Пишу приложение для работы с камерой. При тестировании на устройстве 4.4.2 вылетает с ошибкой. В андроид студио показывает на строчку
Java(TM) 2 Platform Standard Edition 5.0
1
 camera = Camera.open(0);
Все форумы перечитал. Там советуют править манифест и перезагрузить устройство. Всё это сделал. В манифест добавил:
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
        <uses-permission android:name="android.permission.CAMERA" />
        <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
package com.example.myapplication;
 
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
 
import java.io.IOException;
 
 
public class MainActivity extends ActionBarActivity {
 
    SurfaceView sv;
    SurfaceHolder holder;
    HolderCallback holderCallback;
    Camera camera;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        sv = (SurfaceView) findViewById(R.id.surfaceView);
        holder = sv.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 
        holderCallback = new HolderCallback();
        holder.addCallback(holderCallback);
    }
 
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    protected void onResume() {
        super.onResume();
        camera = Camera.open(0);
       // setPreviewSize(FULL_SCREEN);
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        if (camera != null)
            camera.release();
        camera = null;
    }
 
 
 
    class HolderCallback implements SurfaceHolder.Callback {
 
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
 
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                   int height) {
            camera.stopPreview();
            //setCameraDisplayOrientation(CAMERA_ID);
            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
 
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
 
        }
 
    }
}
Добавлено через 9 минут
Закоментил camera.open(0), вылетает на
camera.setPreviewDisplay(holder);
Пишет java.lang.NullPointerException

Добавлено через 27 минут
на эмуляторе таже ошибка

Добавлено через 42 минуты
Похоже, проблема в платформе. Все примеры вылетают на этом месте
Ответ: qwerty33, да, с разрешениями у Андроида полная лажа, "студия" редко намекает на то, что там что-то не так.
Интересно, а как же это работало в других версиях?
Вопрос: Создание кастомной камеры. Fail to connect to camera service

Господа,доброго времени суток!
Создаю кастомную камеру и при вызове метода
Код Java(TM) 2 Platform Standard Edition 5.0
1
camera = Camera.open();
приложение падает с ошибкой java.lang.RuntimeException: Fail to connect to camera service.

В AndroidManifest.xml необходимые права указаны:
Код XML
1
2
3
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
Подскажите,как можно победить эту штуку?
Ответ: Пока копировал код на стену форума увидел,что метод
Код Java(TM) 2 Platform Standard Edition 5.0
1
camera = Camera.open();
вызывается 2 раза.
Удалил дубликат,камера наконец-то запустилась,но возникла другая проблема - на дисплее ничего не отображается,экран белого цвета.
Вопрос: Camera не работает

Здравствуйте, помогите, пожалуйста, разобраться. На некоторых устройствах (6.0) не удаётся включить камеру
Java
1
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.setPreviewDisplay(android.view.SurfaceHolder)' on a null object reference
потом

Java
1
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.stopPreview()' on a null object reference
Сама камера инициализировалась.
Проблемы в этих методах:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public void surfaceCreated(SurfaceHolder holder) {
        try {
            this.camera.setPreviewDisplay(holder);
        } catch (Exception var3) {
            var3.printStackTrace();
        }
 
    }
 
    public void surfaceDestroyed(SurfaceHolder holder) {
        this.stopCamera();
    }
Ответ: petruchodd, я, в свою очередь, рекомендую прочитать предыдущие сообщения.
Вопрос: Приложение Camera ругается на отсутствие SD карты

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

На б*длокодил от балды не смотря а может уже есть готовое решение:?)

Скажите ли так вобще можно, или срочно нужно уничтожить код по быстрее?)

Сначало было 2 активити, мне понадобилось что бы на обох было одно и то же navigation drawer(боковое выпадающее меню)
при создании 2рого активити выбрал(базовый активити) при етом заменил весь activity_file.xml скопированый с главной
при етом изменив адрес(копия апп бара главной страницы)
XML
1
2
<include
        layout="@layout/app_bar_file"
только заменив при этом в файле апп бара
XML
1
 <include layout="@layout/content_file" />
и вуаля осталось только сделать общий список меню

Java
1
2
3
4
5
6
7
8
9
10
@Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        Helpers.navigationDraver(getBaseContext(),id);
 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
а вот и отдельный кусок для того что бы брать для всех navigation drawer
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Helpers {
    public static void  navigationDraver(Context context, int id)
    {
        int resId;
        if (id == R.id.home) {
            Intent intent = new Intent(context, MainActivity.class);
            context.startActivity(intent);
        } else if (id == R.id.private_office) {
            Intent intent = new Intent(context, private_office.class);
            context.startActivity(intent);
        } else if (id == R.id.nav_slideshow) {
 
        } else if (id == R.id.nav_manage) {
 
        }
 
    }
}
очень страшный грех сотворил я? поведайте мне насколько страшен етот велосипед? сойдет оставить так как есть:?)(все норм работает)
Ответ:
Сообщение от korshun84
А фрагменты использовать религия не позволяет или что ?
собственное невежество разве что
Вопрос: Android Studio - Navigation Drawer Activity, многостраничное

Всем доброго времени суток)
Справедливости ради, хочу сказать, что я не сразу стал создавать тему, столкнувшись с проблемой. Два дня я искал по различным видеоурокам и сайтам ее решение, но безрезультатно( Поэтому прошу Вашей помощи, форумчане.

С Navigation Drawer Activity вроде все понятно. С фрагментами (пунктами навигации) тоже вроде ясно. Но у меня многостраничное приложение, поэтому столкнулся с проблемой. Если создавать новое Navigation Drawer Activity, то студия ругается, что мол меню навигации уже есть. Оно и логично.
А если приложение многостраничное, то как на каждой странице вставить меню? Создал Empty Activity, попробовал вставить меню (android.support.design.widget.NavigationView + include), но что-то не вышло. В app_bar_activity нужно include content_xxx. Это то есть, на всех страницах, где я захочу вставить меню, мне придется создавать по два активити на страницу? Просто активити и контент?

Может и вопрос глупый, и мое описание тоже, поэтому просто напишу суть: Как создать, n-страничное приложение, и чтобы на каждой странице было одно и то же меню?
Ответ: Пробовал прописывать import android.support.v4.app.Fragment, не помогло

Добавлено через 1 час 44 минуты
Решил проблему. Надо было во фрагменте исправить import android.support.v4.app.Fragment; на import android.app.Fragment;
Вопрос: Navigation drawer

Как так подключить navigation drawer чтобы он был доступен не в одном а во всех или в нескольких активити приложения и во всех этих активити чтобы также не нарушался свой контент кнопки, картинки и тд после добавления navigation drawer ??
Ответ: да, на фрагментах
один дровер, одна активити - много фрагментов