Kamera Berdampingan menggunakan dua SurfaceView

Saya telah menulis kode untuk aplikasi Android yang seharusnya menampilkan pratinjau Kamera secara berdampingan pada dua tampilan permukaan secara bersamaan.

Inilah hasil yang saya inginkan :

http://i.stack.imgur.com/dBk3z.jpg

Masalah yang saya hadapi :

1) Saat apk diinstal, dua aplikasi diinstal.

2) Aplikasi pertama menunjukkan pratinjau kamera pada tampilan permukaan kanan.

3) Aplikasi kedua menunjukkan pratinjau kamera di tampilan permukaan kiri

Tangkapan layar:

1) APK Tunggal Memasang dua aplikasi :

Tautan ke tangkapan layar yang menunjukkan kesalahan: http://i.stack.imgur.com/lKw2b.png

2) Saat saya membuka Aplikasi Pertama menampilkan Pratinjau Kamera di SurfaceView Kiri :

Tautan ke tangkapan layar yang menunjukkan kesalahan: i.stack.imgur.com/LqA5j.png

3) Saat saya membuka Aplikasi kedua menampilkan Pratinjau Kamera di SurfaceView Kanan :

Tautan ke tangkapan layar yang menunjukkan kesalahan: i.stack.imgur.com/DU6c7.png

Kode :

Manifes Android.xml

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

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name="com.javacodegeeks.androidsurfaceviewexample.AndroidSurfaceviewExample"

        android:label="@string/app_name" 
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>
    <activity
        android:name="com.javacodegeeks.androidsurfaceviewexample.AndroidSurfaceviewExample2"
        android:label="@string/app_name" 
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">

    </activity>
</application>

First Java Class :

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;

PictureCallback rawCallback;
ShutterCallback shutterCallback;
PictureCallback jpegCallback;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
    surfaceHolder = surfaceView.getHolder();

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    surfaceHolder.addCallback(this);

    // deprecated setting, but required on Android versions prior to 3.0


    jpegCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            FileOutputStream outStream = null;
            try {
                outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
                outStream.write(data);
                outStream.close();
                Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
            Toast.makeText(getApplicationContext(), "Picture Saved", 2000).show();
            refreshCamera();
        }
    };
}

public void captureImage(View v) throws IOException {
    //take the picture
    camera.takePicture(null, null, jpegCallback);
}

public void refreshCamera() {
    if (surfaceHolder.getSurface() == null) {
        // preview surface does not exist
        return;
    }

    // stop preview before making changes
    try {
        camera.stopPreview();
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }

    // set preview size and make any resize, rotate or
    // reformatting changes here
    // start preview with new settings
    try {
        camera.setPreviewDisplay(surfaceHolder);
        camera.startPreview();
    } catch (Exception e) {

    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    refreshCamera();
}

public void surfaceCreated(SurfaceHolder holder) {
    try {
        // open the camera
        camera = Camera.open();
    } catch (RuntimeException e) {
        // check for exceptions
        System.err.println(e);
        return;
    }
    Camera.Parameters param;
    param = camera.getParameters();

    // modify parameter
    param.setPreviewSize(352, 288);
    camera.setParameters(param);
    try {
        // The Surface has been created, now tell the camera where to draw
        // the preview.
        camera.setPreviewDisplay(surfaceHolder);
        camera.startPreview();
    } catch (Exception e) {
        // check for exceptions
        System.err.println(e);
        return;
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // stop preview and release camera
    camera.stopPreview();
    camera.release();
    camera = null;
}

Kelas Dua :

Camera camera;
SurfaceView surfaceView2;
SurfaceHolder surfaceHolder2;

PictureCallback rawCallback;
ShutterCallback shutterCallback;
PictureCallback jpegCallback;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    surfaceView2 = (SurfaceView) findViewById(R.id.surfaceView2);
    surfaceHolder2 = surfaceView2.getHolder();

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    surfaceHolder2.addCallback(this);

    // deprecated setting, but required on Android versions prior to 3.0


    jpegCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            FileOutputStream outStream = null;
            try {
                outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
                outStream.write(data);
                outStream.close();
                Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
            Toast.makeText(getApplicationContext(), "Picture Saved", 2000).show();
            refreshCamera();
        }
    };
}

public void captureImage(View v) throws IOException {
    //take the picture
    camera.takePicture(null, null, jpegCallback);
}

public void refreshCamera() {
    if (surfaceHolder2.getSurface() == null) {
        // preview surface does not exist
        return;
    }

    // stop preview before making changes
    try {
        camera.stopPreview();
    } catch (Exception e) {
        // ignore: tried to stop a non-existent preview
    }

    // set preview size and make any resize, rotate or
    // reformatting changes here
    // start preview with new settings
    try {
        camera.setPreviewDisplay(surfaceHolder2);
        camera.startPreview();
    } catch (Exception e) {

    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    refreshCamera();
}

public void surfaceCreated(SurfaceHolder holder) {
    try {
        // open the camera
        camera = Camera.open();
    } catch (RuntimeException e) {
        // check for exceptions
        System.err.println(e);
        return;
    }
    Camera.Parameters param;
    param = camera.getParameters();

    // modify parameter
    param.setPreviewSize(352, 288);
    camera.setParameters(param);
    try {
        // The Surface has been created, now tell the camera where to draw
        // the preview.
        camera.setPreviewDisplay(surfaceHolder2);
        camera.startPreview();
    } catch (Exception e) {
        // check for exceptions
        System.err.println(e);
        return;
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // stop preview and release camera
    camera.stopPreview();
    camera.release();
    camera = null;
}

aktivitas_main.xml :

    <SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" />
    <SurfaceView
    android:id="@+id/surfaceView2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" />
</LinearLayout>

Pembaruan Penting :

Saya menemukan bahwa dengan mengedit file AndroidManifest.xml dan dengan menghapus aktivitas kedua adalah peluncur, kita dapat menghilangkan dua ikon aplikasi di layar beranda.

Namun apk yang dihasilkan dengan melakukan hal tersebut saat instalasi terbuka dengan menampilkan pratinjau kamera hanya pada tampilan permukaan kiri dan tampilan permukaan kanan tampak hitam,

Terima kasih, semoga kalian dapat membantu saya :)


person Geeve George    schedule 27.03.2015    source sumber
comment
Saya sedang dalam pencarian serupa. Mengapa Anda memutuskan untuk membuat 2 kelas? Apakah Anda sudah menyelesaikan masalahnya?   -  person Niels    schedule 23.06.2015
comment
Hai @Geeve George dan Niels...kalian berdua Mencapai ini...jika ya maka Tolong bantu saya...saya juga ingin beberapa pratinjau kamera ke dalam satu aktivitas....saya sudah mengajukan Pertanyaan Di Sini..Silakan periksa dan beri tahu saya jika Anda tahu ini mendesak......TOLONG....pertanyaan saya Tautannya adalah.......stackoverflow.com/questions/41392791/   -  person Sagar Aghara    schedule 18.01.2017