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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Безопасное подключение к PHP-скрипту через приложение http://www.cyberforum.ru/android-dev/thread1198045.html
Не знал как правильно назвать тему, в общем у меня есть небольшая проблема. Объясню по порядку: Есть у меня PHP-скрипт на сервере (доступный по ссылке http://site.com/script.php например), который...
Программирование Android Простейший навигатор Доброго всем времени суток! Есть не столько необходимость, сколько задумка. Программа должна использовать GPS и считывать координаты устройства, и если они входят в некий диапазон, то сообщать... http://www.cyberforum.ru/android-dev/thread1197958.html
Программирование Android Как обновить одно поле в таблице SQLite Android
Привет. Встал вопрос... Как обновить только одну запись в таблице SQLite - Android. Обновлять всю запись слишком много лишнего кода...
Программирование Android Unable to Start Activity ComponentInfo
Добрый день! Недавно начал изучать программирование под Андроид и столкнулся с такой проблемой. В моем ADT создаю новый проект. Там по умолчанию предлагается activity_main.xml и fragment_main.xml...
Программирование Android Поиск файла http://www.cyberforum.ru/android-dev/thread1197673.html
Есть приложение, которое создает файл и записывает туда что то. Это происходит в первом классе. private void WriteFile(String str) { try { BufferedWriter bw = new BufferedWriter(new...
Программирование Android Вызов новой активити не из класса активити Есть 4 класса: 1) WelcomeActivity; 2) MainActivity; 3) PopUpActivity; 4) Client. Программа работает с сервером и получает данные в класс Client. Логика такая, загружается WelcomeActivity, куда... подробнее

Показать сообщение отдельно
iandryxa5
1 / 1 / 0
Регистрация: 22.03.2014
Сообщений: 173
03.06.2014, 22:38  [ТС]
пардон за тупизм)

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