Android調(diào)用前后攝像頭同時(shí)工作

硬件環(huán)境:小米4
Android版本:6.0

咱們先看效果圖:

Paste_Image.png

我把代碼貼出來:

AndroidMainfest.xml文件(需要新增camera權(quán)限):

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

activity_main.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.bihu.qdemopush.MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:orientation="horizontal">
    <SurfaceView
        android:id="@+id/surfaceview1"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="fill_parent" />
    <SurfaceView
        android:id="@+id/surfaceview2"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_marginLeft="5dp"
        android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>

MainActivity.java文件:主要是對2個surfaceView的顯示渲染

public class MainActivity extends AppCompatActivity {

SurfaceView surfaceview1, surfaceview2;
SurfaceHolder surfaceholder1, surfaceholder2;
String TAG = "MainActivity";
private Camera camera1 = null, camera2;
Camera.Parameters parameters;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    surfaceview1 = (SurfaceView) findViewById(R.id.surfaceview1);
    surfaceview2 = (SurfaceView) findViewById(R.id.surfaceview2);
    surfaceholder1 = surfaceview1.getHolder();
    surfaceholder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    surfaceholder1.addCallback(new surfaceholderCallbackBack());

    surfaceholder2 = surfaceview2.getHolder();
    surfaceholder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    surfaceholder2.addCallback(new surfaceholderCallbackFont());
}

@Override
protected void onDestroy() {
    Log.e(TAG, "onDestroy");
    super.onDestroy();
}

/**
 * 后置攝像頭回調(diào)
 */
class surfaceholderCallbackBack implements SurfaceHolder.Callback {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 獲取camera對象
        int cameraCount = Camera.getNumberOfCameras();
        if (cameraCount > 0) {
            camera1 = Camera.open(0);
            try {
                // 設(shè)置預(yù)覽監(jiān)聽
                camera1.setPreviewDisplay(holder);
                Camera.Parameters parameters = camera1.getParameters();

                if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                    parameters.set("orientation", "portrait");
                    camera1.setDisplayOrientation(90);
                    parameters.setRotation(90);
                } else {
                    parameters.set("orientation", "landscape");
                    camera1.setDisplayOrientation(0);
                    parameters.setRotation(0);
                }
                camera1.setParameters(parameters);
                // 啟動攝像頭預(yù)覽
                camera1.startPreview();
                System.out.println("camera.startpreview");

            } catch (IOException e) {
                e.printStackTrace();
                camera1.release();
                System.out.println("camera.release");
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        camera1.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if (success) {
                    initCamera();// 實(shí)現(xiàn)相機(jī)的參數(shù)初始化
                    camera.cancelAutoFocus();// 只有加上了這一句,才會自動對焦粗俱。
                }
            }
        });

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    // 相機(jī)參數(shù)的初始化設(shè)置
    private void initCamera() {
        parameters = camera1.getParameters();
        parameters.setPictureFormat(PixelFormat.JPEG);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1連續(xù)對焦
        setDispaly(parameters, camera1);
        camera1.setParameters(parameters);
        camera1.startPreview();
        camera1.cancelAutoFocus();// 2如果要實(shí)現(xiàn)連續(xù)的自動對焦说榆,這一句必須加上
    }

    // 控制圖像的正確顯示方向
    private void setDispaly(Camera.Parameters parameters, Camera camera) {
        if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
            setDisplayOrientation(camera, 90);
        } else {
            parameters.setRotation(90);
        }

    }

    // 實(shí)現(xiàn)的圖像的正確顯示
    private void setDisplayOrientation(Camera camera, int i) {
        Method downPolymorphic;
        try {
            downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
            if (downPolymorphic != null) {
                downPolymorphic.invoke(camera, new Object[]{i});
            }
        } catch (Exception e) {
            Log.e("Came_e", "圖像出錯");
        }
    }
}

class surfaceholderCallbackFont implements SurfaceHolder.Callback {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 獲取camera對象
        int cameraCount = Camera.getNumberOfCameras();
        if (cameraCount == 2) {
            camera2 = Camera.open(1);
        }
        try {
            // 設(shè)置預(yù)覽監(jiān)聽
            camera2.setPreviewDisplay(holder);
            Camera.Parameters parameters = camera2.getParameters();

            if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                parameters.set("orientation", "portrait");
                camera2.setDisplayOrientation(90);
                parameters.setRotation(90);
            } else {
                parameters.set("orientation", "landscape");
                camera2.setDisplayOrientation(0);
                parameters.setRotation(0);
            }
            camera2.setParameters(parameters);
            // 啟動攝像頭預(yù)覽
            camera2.startPreview();
            System.out.println("camera.startpreview");

        } catch (IOException e) {
            e.printStackTrace();
            camera2.release();
            System.out.println("camera.release");
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        camera2.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if (success) {
                    parameters = camera2.getParameters();
                    parameters.setPictureFormat(PixelFormat.JPEG);
                    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1連續(xù)對焦
                    setDispaly(parameters, camera2);
                    camera2.setParameters(parameters);
                    camera2.startPreview();
                    camera2.cancelAutoFocus();// 2如果要實(shí)現(xiàn)連續(xù)的自動對焦,這一句必須加上
                    camera.cancelAutoFocus();// 只有加上了這一句,才會自動對焦签财。
                }
            }
        });

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    // 控制圖像的正確顯示方向
    private void setDispaly(Camera.Parameters parameters, Camera camera) {
        if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
            setDisplayOrientation(camera, 90);
        } else {
            parameters.setRotation(90);
        }

    }

    // 實(shí)現(xiàn)的圖像的正確顯示
    private void setDisplayOrientation(Camera camera, int i) {
        Method downPolymorphic;
        try {
            downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
            if (downPolymorphic != null) {
                downPolymorphic.invoke(camera, new Object[]{i});
            }
        } catch (Exception e) {
            Log.e("Came_e", "圖像出錯");
        }
    }
}
}

可能出現(xiàn)的問題:
1串慰、沒有權(quán)限,需要手動打開唱蒸,代碼里由于追求簡便邦鲫,沒有主動申請,只在mainfest中注冊了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末神汹,一起剝皮案震驚了整個濱河市庆捺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屁魏,老刑警劉巖滔以,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氓拼,居然都是意外死亡你画,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門桃漾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坏匪,“玉大人,你說我怎么就攤上這事撬统∈首遥” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵宪摧,是天一觀的道長粒竖。 經(jīng)常有香客問我颅崩,道長几于,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任沿后,我火速辦了婚禮沿彭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尖滚。我一直安慰自己喉刘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布漆弄。 她就那樣靜靜地躺著睦裳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撼唾。 梳的紋絲不亂的頭發(fā)上廉邑,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼蛛蒙。 笑死糙箍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牵祟。 我是一名探鬼主播深夯,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诺苹!你這毒婦竟也來了咕晋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤收奔,失蹤者是張志新(化名)和其女友劉穎捡需,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筹淫,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡站辉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了损姜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饰剥。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摧阅,靈堂內(nèi)的尸體忽然破棺而出汰蓉,到底是詐尸還是另有隱情,我是刑警寧澤棒卷,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布顾孽,位于F島的核電站,受9級特大地震影響比规,放射性物質(zhì)發(fā)生泄漏若厚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一蜒什、第九天 我趴在偏房一處隱蔽的房頂上張望测秸。 院中可真熱鬧,春花似錦灾常、人聲如沸霎冯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沈撞。三九已至,卻和暖如春雕什,著一層夾襖步出監(jiān)牢的瞬間缠俺,已是汗流浹背拧廊。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晋修,地道東北人吧碾。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像墓卦,于是被迫代替她去往敵國和親倦春。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容