Android調用前后攝像頭同時工作實例代碼
硬件環(huán)境:小米4
Android版本:6.0
咱們先看效果圖:
我把代碼貼出來:
AndroidMainfest.xml文件(需要新增camera權限):
<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(); } /** * 后置攝像頭回調 */ class surfaceholderCallbackBack implements SurfaceHolder.Callback { @Override public void surfaceCreated(SurfaceHolder holder) { // 獲取camera對象 int cameraCount = Camera.getNumberOfCameras(); if (cameraCount > 0) { camera1 = Camera.open(0); try { // 設置預覽監(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); // 啟動攝像頭預覽 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();// 實現(xiàn)相機的參數(shù)初始化 camera.cancelAutoFocus();// 只有加上了這一句,才會自動對焦。 } } }); } @Override public void surfaceDestroyed(SurfaceHolder holder) { } // 相機參數(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如果要實現(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); } } // 實現(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 { // 設置預覽監(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); // 啟動攝像頭預覽 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如果要實現(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); } } // 實現(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、沒有權限,需要手動打開,代碼里由于追求簡便,沒有主動申請,只在mainfest中注冊了
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android基于開源項目xutils3實現(xiàn)下載
這篇文章主要介紹了Android基于開源項目xutils3實現(xiàn)下載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11Android AutoCompleteTextView控件使用實例
AutoCompleteTextView這個控件用于輸入框的自動完成提示,非常適合搜索框等。它本質上是個EditText,實際上它也是從EditText繼承的,使用起來也十分簡單2014-04-04Android BroadcastReceiver實現(xiàn)網(wǎng)絡狀態(tài)實時監(jiān)聽
這篇文章主要為大家詳細介紹了Android BroadcastReceiver實現(xiàn)網(wǎng)絡狀態(tài)實時監(jiān)聽,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05Android?WebView開發(fā)之自定義WebView工具框
在WebView頁面長按時會彈出一個復制框,有的時候里面的item不是我們想要,這個時候我們就可以自定義一個工具框。本文就將介紹如何通過WebView自定義工具框,需要的朋友可以參考一下2021-12-12Android自定義View 實現(xiàn)水波紋動畫引導效果
在android程序開發(fā)中,我們經常簡單通過自定義view實現(xiàn)水波紋動畫引導功能,下面通過本文給大家分享實現(xiàn)代碼,需要的朋友參考下2017-01-01Android中EditText和AutoCompleteTextView設置文字選中顏色方法
這篇文章主要介紹了Android中EditText和AutoCompleteTextView設置文字選中顏色方法,本文給出了效果圖和實現(xiàn)代碼,需要的朋友可以參考下2015-01-01