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

Работа с API камеры - Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 170
03.06.2014, 20:09     Работа с API камеры #1
Ребят возникла такая проблема при работе с 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 камеры
Посмотрите здесь:

Как зажечь вспышку от камеры? Android
Проверка наличия камеры Android
Android Создание простой камеры
Android Вывод картинки из камеры в приложении
Изменения контраста у изображения с камеры Android
Android Android Studio не дает работать с API 8 без установленного API 21
Работа с vkontakte API Android
Перевернутое изображение камеры Android
Android Распознавание текста с камеры
Android Ошибка minSDK(API 23, N preview) != deviceSDK(API 17)
Вспышка срабатывает раньше камеры Android
Захват движения с камеры Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 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 камеры
Ответ Создать тему
Опции темы

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