Вопрос по android – Android Camera Surface View

11

Я пытаюсь создать вид поверхности для камеры, чтобы она отображалась на поверхности, когда она находится в поле зрения камеры. На данный момент все, что я могу видеть на своем экране камеры, - это черный экран. Я пытался найти в Google и здесь, но до сих пор я не нашел то, что я ищу. Любой может предложить мне какую-то идею.

Ваш Ответ

2   ответа
19

Я написал класс, который может вам помочь.

    public class Preview_can_work extends Activity {
        private SurfaceView surface_view;  
        private Camera mCamera;
        SurfaceHolder.Callback sh_ob = null;
        SurfaceHolder surface_holder        = null;
        SurfaceHolder.Callback sh_callback  = null;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            getWindow().setFormat(PixelFormat.TRANSLUCENT);

            surface_view = new SurfaceView(getApplicationContext());
            addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

            if (surface_holder == null) {
                surface_holder = surface_view.getHolder();
            }

            sh_callback = my_callback();
            surface_holder.addCallback(sh_callback);
        }

            SurfaceHolder.Callback my_callback() {      
                SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() {

                    @Override
                    public void surfaceDestroyed(SurfaceHolder holder) {
                          mCamera.stopPreview();
                          mCamera.release();
                          mCamera = null;
                    }

                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {
                        mCamera = Camera.open();

                          try {
                               mCamera.setPreviewDisplay(holder);  
                          } catch (IOException exception) {  
                                mCamera.release();  
                                mCamera = null;  
                          }
                    }

                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                            int height) {
                        mCamera.startPreview();
                    }
                };
                return ob1;
        }
    }

в файле манифеста скопируйте этот код для разрешения камеры

<uses-permission android:name="android.permission.CAMERA"/>

Объяснение:

SurfaceView - это тип View, который содержит SurfaceHolder. SurfaceHolder содержит поверхность, на которой мы можем отображать наши медиа (обычно кадры).

mCamera является объектом Camera, который будет содержать экземпляр камеры.

Если вы хотите сохранить экземпляр камеры по умолчанию, вы можете просто позвонитьCamera.open();

Camera mCamera = Camera.open();

Теперь у вас есть открытая камера или у вас есть экземпляр камеры по умолчанию. Теперь вам нужно захватывать кадры с камеры и отображать ее на поверхности. Но вы не можете отобразить его без каких-либо

surface, ЗдесьsurfaceView обеспечиваетsurfaceHolder а такжеsurfaceHolder обеспечиваетsurface для отображения кадров камеры. Теперь когдаsurface будут созданы три функции обратного вызова

называется.

1. public void surfaceCreated(SurfaceHolder holder)
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
3. public void surfaceDestroyed(SurfaceHolder holder)

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

surfaceCreated:      surfaceCreated - это функция обратного вызова, которая будет вызываться при создании вашей поверхности. В этом вы можете открыть камеру и установить другие атрибуты.

surfaceChanged: This will be called atleast one time when your surface will be created. After that it will be called whenever your surface will change(In device rotation). Here you can

начните предварительный просмотр, потому что ваша поверхность уже создана.

surfaceDestroyed: This will be called every time when your surface will destroy. Now if you dont have surface then where you can display you camera frames so I have released camera by using

mCamera.release(), Это очень важно, потому что если ваша активность будет приостановлена, а любая другая попытка будет открывать камеру, она не сможет открыть ее, как у вас.

уже открытая камера. Камера является общим ресурсом, поэтому один раз его может использовать только одно приложение. Так что помните одну вещь, когда вы открываете камеру, а затем всегда отпускайте ее.

stopPreview: When you start preview then your camera starts capturing your frames and display it on a surface. Now if your surface have destroyed then you need to stop capturing frames

с камеры, поэтому вы должны позвонитьmCamera.stopPreview.

@Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); mCamera = null; }  Можете ли вы сказать мне, для чего выше метод? Нужно ли нам использоватьrelease() как я не уверен, что этоrelease() функция для? Kitaro
@BharatSharma: Спасибо за код, он работает, но вид с камеры показывает повернутое изображение (вверх-вниз) .... Hwlp Mw Пожалуйста
На самом деле, при создании эмулятора вам нужно добавить в него камеру, тогда я думаю, что она будет работать. я постараюсь и дам вам знать ..
Спасибо, Бхарат, я определенно попробую! еще раз спасибо. Кто-нибудь знает хорошую статью, где я могу прочитать о & # x201C; Камера не работает при работе в эмуляторе & # x201D ;? Это правда еще? Kitaro
Итак, нам не нужно иметь устройство, чтобы использовать камеру для просмотра в реальном времени? Потому что некоторые статьи, которые я прочитал, говорят, что мы не можем запустить камеру в эмуляторе, но я не уверен, что это было решено. Пожалуйста, дайте мне знать. Благодарю. Kitaro
0

Убедитесь, что вы добавили разрешение:

<uses-permission android:name="android.permission.CAMERA"/>

Также эти свойства окна:

getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                 WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Опубликуйте код, если он не работает, чтобы помочь вам

Спасибо, я уже добавил разрешение, как вы предложили; и я думал об использованииsurfaceChanged ? На данный момент все, что я вижу на своей поверхности для просмотра камеры, черное ... Я не понимаю, почему. Kitaro

Похожие вопросы