Autore Topic: Preview simultaneo delle due fotocamere del dispositivo  (Letto 557 volte)

Offline fratellonero

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Preview simultaneo delle due fotocamere del dispositivo
« il: 19 Febbraio 2013, 18:20:34 CET »
0
Come da oggetto l'app si prefigge di visualizzare contemporaneamente la preview delle due fotocamere presenti sul dispositivo;
L'applicazione di per se non genera nessun errore ma funziona in maniera anomala.

Come illustra la documentazione ufficiale:
Camera | Android Developers

ho creato in prima analisi una classe che estendesse SurfaceView ed implementasse SurfaceHolder.Callback nel seguente modo:

Codice (Java): [Seleziona]
public class MyPreview extends SurfaceView implements SurfaceHolder.Callback {

        private String TAG = "MyPreview";
       
        private SurfaceHolder mHolder;
        private Camera mCamera;
       
       
       
        public MyPreview(Context context, Camera camera) {
                super(context);
                mCamera = camera;
               
                mHolder = getHolder();
                mHolder.addCallback(this);
               
                mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
               
        }
       
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
                try{
                        mCamera.setPreviewDisplay(holder);
                        mCamera.startPreview();
                }
                catch (IOException e) {
                        Log.e(TAG,"Error setting camera preview:"+e.getMessage());
                }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
                // empty. Take care of releasing the Camera preview in your activity.
        }

       
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                if(mHolder.getSurface() == null){
                        //preview surface does not exist
                        return;
                }
               
                try{
                        mCamera.stopPreview();
                }
                catch (Exception e) {
                        // ignore: tried to stop a non-existent preview
                }
                try{
                        mCamera.setPreviewDisplay(mHolder);
                        mCamera.startPreview();
                        Log.i(TAG, "Camera UPP::" +mCamera.toString());
                }
                catch (Exception e) {
                        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
                }
        }
       
}

Sempre come da documentazione ufficiale ho modificato il mio Layout

Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:orientation="horizontal"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="#0000FF">

    <FrameLayout
       android:id="@+id/camera_preview0"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1"
       />
   
    <FrameLayout
       android:id="@+id/camera_preview1"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:layout_weight="1"
       />
</LinearLayout>

E di seguito l'activity principale
Codice (Java): [Seleziona]
public class ControllCameraActivity extends Activity {

       
        private Camera mCamera0;
        private Camera mCamera1;
        private MyPreview mPreview0;
        private MyPreview mPreview1;
       
       
        private FrameLayout lLPreview0;
        private FrameLayout lLPreview1;
       
        private String TAG = "Camera Controll::";
       
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_controll_camera);
                Log.i(TAG, "Create");
               
               
        }
       
        @Override
        protected void onResume(){
                super.onResume();
                //Creo una istanza di Camera;
                mCamera0 = getCameraInstance(0);
                mPreview0 = new MyPreview(this, mCamera0);
                lLPreview0 = (FrameLayout)findViewById(R.id.camera_preview0);
                lLPreview0.addView(mPreview0);
               
                mCamera1 = getCameraInstance(1);
                mPreview1 = new MyPreview(this, mCamera1);
                lLPreview1 = (FrameLayout)findViewById(R.id.camera_preview1);
                lLPreview1.addView(mPreview1);
               
        }
       
        @Override
        protected void onPause(){
                super.onPause();
                releaseCamera(mCamera0);
                releaseCamera(mCamera1);
                Log.i(TAG, "Pause");
        }

public static Camera getCameraInstance(int n){
                Camera c = null;
                try{
                        //Tento di avere un'istanza di Camera
                        c = Camera.open(n);
                }
                catch(Exception e){
                        //Camera non è disponibile(in uso o assente)
                        Log.e("Get Camera Instance::",e.getMessage());
                }
                return c;
        }
private void releaseCamera(Camera mCamera){
                if (mCamera != null){
                        mCamera.stopPreview();
                        mCamera.release();
                        mCamera = null;
                }
                       
        }
}

L'applicazione si avvia e termina senza errori, ma quando si avvia nel primo FrameLayout viene visualizzato solo il primo frame della mCamera0, nel secondo FrameLayout viene visualizzato (inspiegabilmente per me ) la preview della mCamera0, anche se da come si può vedere dal codice ci dovrebbe essere la preview della della mCamera1.

Spero di essere stato chiaro nel comportamento anomalo. Ho provato ad usare thread separati ma il risultato non cambia.

Qualche aiuto per la risoluzione del problema?

Grazie a tutti