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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 170
#1

Работа с API камеры - Программирование Android

03.06.2014, 20:09. Просмотров 2123. Ответов 2
Метки нет (Все метки)

Ребят возникла такая проблема при работе с API камеры, при нажатии кнопки запуска камеры, приложение вылетает при этом логи ссылаются на метод:
Java
1
2
3
4
5
6
 public void onResume() {
        super.onResume();
        
        mCamera = Camera.open();
    
    }
В чем может проблема?
Если необходимо могу скинуть полный код
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2014, 20:09     Работа с API камеры
Посмотрите здесь:

Работа с vkontakte API - Программирование Android
Здравствуйте, я раньше писал об аутентификацие через соц. сети. Решил использовать ВК, нашел ссылку:...

Работа с Google Drive Api - Программирование Android
Есть ли годные статьи или видео по работе с Google Диском? Задача написать стороннее приложение, которое сможет читать файлы из GD...

Создание простой камеры - Программирование Android
Целью работы является создать камеру , которая будет уметь : - делать фото - сохранять фото - переключаться между передней и задней...

Проверка наличия камеры - Программирование Android
Доброго времени. подскажите плиз, как проверить наличие камеры на устройстве? проверяю вот таким методом private boolean...

Захват движения с камеры - Программирование Android
Добрый день! Вопрос: Возможно ли написать команду которая будет фиксировать движение и делать подсчет этих самых движений? Пример: 1)...

Распознавание текста с камеры - Программирование Android
Добрый день. Подскажите пожалуйста, есть ли библиотеки, которые позволяют определять с фото текст или цифры? К примеру сфотографировать...

Перевернутое изображение камеры - Программирование Android
при использовании камеры в приложении получается что картинка с камеры повернута в окне отображения. И отображение выглядит не очень...

Как зажечь вспышку от камеры? - Программирование Android
Как зажечь вспышку от камеры не включая камеру

Вспышка срабатывает раньше камеры - Программирование Android
Здравствуйте... Имеется смартфон на системе Android 5.1 Проблема следующая, при использование камеры, во время фотографирования -...

Изображение с камеры вывести на RelativeLayout - Программирование Android
Есть RelativeLayout на нем нет ничего (в дальнейшем будет несколько кнопок и imageView как можно стелать чтобы избражение с камеры...

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

Получить отдельный кадр с камеры - Программирование Android
У меня идет захват видео через камеру. Но мне нужно анализировать из этого видео кадры. Как правильно сохранять каждый кадр видео с...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
03.06.2014, 20:22     Работа с API камеры #2
Цитата Сообщение от iandryxa5 Посмотреть сообщение
Если необходимо могу скинуть полный код
Да нет, не надо. И логов тоже не надо. Всё понятно же.
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 170
03.06.2014, 22:38  [ТС]     Работа с API камеры #3
пардон за тупизм)

код класса CameraFragment
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
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
public class CrimeCameraFragment extends Fragment {
    
    
    private static final String TAG = "CrimeCameraFragment";
 
    private Camera mCamera;
    private SurfaceView mSurfaceView;
    private View mProgressContainer;
 
 
    @Override
    @SuppressWarnings("deprecation")
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_crime_camera, parent, false);
 
        mProgressContainer = v.findViewById(R.id.crime_camera_progressContainer);
        mProgressContainer.setVisibility(View.INVISIBLE);
        Button takePictureButton = (Button)v.findViewById(R.id.btnCrimeCamera);
        takePictureButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                getActivity().finish();
            } 
        });
 
        mSurfaceView = (SurfaceView)v.findViewById(R.id.crime_camera_surfaceView);
        SurfaceHolder holder = mSurfaceView.getHolder();
        // deprecated, but required for pre-3.0 devices
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        holder.addCallback(new SurfaceHolder.Callback() {
 
            public void surfaceCreated(SurfaceHolder holder) {
                // tell the camera to use this surface as its preview area
                try {
                    if (mCamera != null) {
                        mCamera.setPreviewDisplay(holder);
                    }
                } catch (IOException exception) {
                    Log.e(TAG, "Error setting up preview display", exception);
                }
            }
 
            public void surfaceDestroyed(SurfaceHolder holder) {
                // we can no longer display on this surface, so stop the preview.
                if (mCamera != null) {
                    mCamera.stopPreview();
                }
            }
 
            public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
                if (mCamera == null) return;
                
                // the surface has changed size; update the camera preview size
                Camera.Parameters parameters = mCamera.getParameters();
                Size s = getBestSupportedSize(parameters.getSupportedPreviewSizes(), w, h);
                parameters.setPreviewSize(s.width, s.height);
                mCamera.setParameters(parameters);
                try {
                    mCamera.startPreview();
                } catch (Exception e) {
                    Log.e(TAG, "Could not start preview", e);
                    mCamera.release();
                    mCamera = null;
                }
            }
        });
        
        return v; 
    }
 
    @TargetApi(9)
    @Override
    public void onResume() {
        super.onResume();
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {    
            mCamera = Camera.open(0);
        } else {
            mCamera = Camera.open();
        }
    }
 
    @Override
    public void onPause() {
        super.onPause();
 
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }
 
   
    private Size getBestSupportedSize(List<Size> sizes, int width, int height) {
        Size bestSize = sizes.get(0);
        int largestArea = bestSize.width * bestSize.height;
        for (Size s : sizes) {
            int area = s.width * s.height;
            if (area > largestArea) {
                bestSize = s;
                largestArea = area;
            }
        }
        return bestSize;
    }
    
}
Вызов активности с фаргментом происходит из другого фрагмента по нажатию кнопки:
Java
1
2
3
4
5
6
7
 mCameraButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // запуск активности камеры 
                Intent i = new Intent(getActivity(), CrimeCameraActivity.class);
                startActivity(i);
            }
        });
Логи говорят следующие:


06-03 17:47:09.883: E/AndroidRuntime(535): FATAL EXCEPTION: main
06-03 17:47:09.883: E/AndroidRuntime(535): java.lang.RuntimeException: Unable to resume activity {com.bignerbranch.android.criminalintent/com.bignerbranch.android.criminalintent.CrimeCameraActivity}: java.lang.RuntimeException: Fail to connect to camera service
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.os.Handler.dispatchMessage(Handler.java:99)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.os.Looper.loop(Looper.java:137)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-03 17:47:09.883: E/AndroidRuntime(535): at java.lang.reflect.Method.invokeNative(Native Method)
06-03 17:47:09.883: E/AndroidRuntime(535): at java.lang.reflect.Method.invoke(Method.java:511)
06-03 17:47:09.883: E/AndroidRuntime(535): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-03 17:47:09.883: E/AndroidRuntime(535): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-03 17:47:09.883: E/AndroidRuntime(535): at dalvik.system.NativeStart.main(Native Method)
06-03 17:47:09.883: E/AndroidRuntime(535): Caused by: java.lang.RuntimeException: Fail to connect to camera service
06-03 17:47:09.883: E/AndroidRuntime(535): at android.hardware.Camera.native_setup(Native Method)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.hardware.Camera.<init>(Camera.java:302)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.hardware.Camera.open(Camera.java:264)
06-03 17:47:09.883: E/AndroidRuntime(535): at com.bignerbranch.android.criminalintent.CrimeCameraFragment.onResume(CrimeCameraFragment.java:95)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.support.v4.app.Fragment.performResume(Fragment.java:1543)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:963)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:1894)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:466)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:455)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.Activity.performResume(Activity.java:4552)
06-03 17:47:09.883: E/AndroidRuntime(535): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434)
06-03 17:47:09.883: E/AndroidRuntime(535): ... 12 more

Добавлено через 48 минут
и кстате то же самое происходит, при след коде:
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
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
public class MainActivity extends Activity {
    
    Camera camera;
    HolderCallback holderCallback;
    SurfaceHolder holder;
    SurfaceView sv;
    
    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.main_cam);
        
        sv = (SurfaceView)findViewById(R.id.surView1);
        holder = sv.getHolder();
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        
        
        holderCallback = new HolderCallback();
        holder.addCallback(holderCallback);
        
        
    }
 
    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    public void onResume(){
        super.onResume();
        camera = Camera.open(CAMERA_ID);
        setPreviewSize(FULL_SCREEN);
        
    }
    
    public void onPause(){
        super.onPause();
        if(camera!=null)
            camera.release();
            camera=null;
        
    }
 
    class HolderCallback implements SurfaceHolder.Callback{
        
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            try{
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            }catch(Exception e){
                e.printStackTrace();
            }
            
        }
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub
            camera.stopPreview();
            setCameraDisplayOrientation(CAMERA_ID);
            try{
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            }catch(Exception e){
                e.printStackTrace();
            }
            
        }
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            
        }
            
    }
    
    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);
    }
    
    @TargetApi(Build.VERSION_CODES.GINGERBREAD)
    @SuppressLint("NewApi")
    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);
        }
        
        
        
    }
Отдельно этот код работает нормально, то есть изображение с камеры выводится в SurfaceView.
Однако если создать такую же активность и ссылаться на нее как в предыдущем примере, приложение опять же вылетает, и логи ссылаются на метод :
Java
1
2
3
4
5
6
7
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
    public void onResume(){
        super.onResume();
        camera = Camera.open(CAMERA_ID);
        setPreviewSize(FULL_SCREEN);
        
    }
Полный список логов:
06-03 18:30:57.267: E/AndroidRuntime(545): FATAL EXCEPTION: main
06-03 18:30:57.267: E/AndroidRuntime(545): java.lang.RuntimeException: Unable to resume activity {com.bignerbranch.android.criminalintent/com.bignerbranch.android.criminalintent.MainActivity}: java.lang.RuntimeException: Fail to connect to camera service
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2444)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2472)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1986)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.os.Handler.dispatchMessage(Handler.java:99)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.os.Looper.loop(Looper.java:137)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-03 18:30:57.267: E/AndroidRuntime(545): at java.lang.reflect.Method.invokeNative(Native Method)
06-03 18:30:57.267: E/AndroidRuntime(545): at java.lang.reflect.Method.invoke(Method.java:511)
06-03 18:30:57.267: E/AndroidRuntime(545): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-03 18:30:57.267: E/AndroidRuntime(545): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-03 18:30:57.267: E/AndroidRuntime(545): at dalvik.system.NativeStart.main(Native Method)
06-03 18:30:57.267: E/AndroidRuntime(545): Caused by: java.lang.RuntimeException: Fail to connect to camera service
06-03 18:30:57.267: E/AndroidRuntime(545): at android.hardware.Camera.native_setup(Native Method)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.hardware.Camera.<init>(Camera.java:302)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.hardware.Camera.open(Camera.java:264)
06-03 18:30:57.267: E/AndroidRuntime(545): at com.bignerbranch.android.criminalintent.MainActivity.onResume(MainActivity.java:53)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1154)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.Activity.performResume(Activity.java:4539)
06-03 18:30:57.267: E/AndroidRuntime(545): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2434)
06-03 18:30:57.267: E/AndroidRuntime(545): ... 12 more
Yandex
Объявления
03.06.2014, 22:38     Работа с API камеры
Ответ Создать тему
Опции темы

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