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

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

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

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

03.06.2014, 20:09. Просмотров 2224. Ответов 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 камеры (Программирование Android):

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

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

Работа с API для мобильного клиента сайта - Программирование
Привет. Пишу клиент для сайта, как сделать API, чтобы нельзя было узнать адрес API?(задача сделать невозможным прямой доступ к информации)

Android SDK Manager не отображает платформы 2.3.3 (API 10), 2.3.1 (API 9). Как быть? - Программирование Android
Добрый день! Использую Android Studio под Windows 7. Из-за несовместимости с операционной системой Android SDK Manager не отображает...

Android Studio не дает работать с API 8 без установленного API 21 - Программирование Android
Удалил все не интересующие меня библиотеки и поставил только API Level 8. Но при создании приложения вылезает куча ошибок таких как: Что...

Ошибка minSDK(API 23, N preview) != deviceSDK(API 17) - Программирование Android
Недавно начал учить андроид и возникла такая ошибка, когда я пытаюсь запустить проект на своем телефоне или эмуляторе. При этом в проекте...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
YuraAAA
1571 / 1313 / 270
Регистрация: 25.10.2009
Сообщений: 3,434
Записей в блоге: 2
03.06.2014, 20:22 #2
Цитата Сообщение от iandryxa5 Посмотреть сообщение
Если необходимо могу скинуть полный код
Да нет, не надо. И логов тоже не надо. Всё понятно же.
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 170
03.06.2014, 22:38  [ТС] #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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2014, 22:38
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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