Android調(diào)用前后攝像頭同時(shí)工作實(shí)例代碼
硬件環(huán)境:小米4
Android版本:6.0
咱們先看效果圖:

我把代碼貼出來(lái):
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文件:主要是對(duì)2個(gè)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對(duì)象
int cameraCount = Camera.getNumberOfCameras();
if (cameraCount > 0) {
camera1 = Camera.open(0);
try {
// 設(shè)置預(yù)覽監(jiān)聽(tīng)
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);
// 啟動(dòng)攝像頭預(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();// 只有加上了這一句,才會(huì)自動(dòng)對(duì)焦。
}
}
});
}
@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ù)對(duì)焦
setDispaly(parameters, camera1);
camera1.setParameters(parameters);
camera1.startPreview();
camera1.cancelAutoFocus();// 2如果要實(shí)現(xiàn)連續(xù)的自動(dòng)對(duì)焦,這一句必須加上
}
// 控制圖像的正確顯示方向
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", "圖像出錯(cuò)");
}
}
}
class surfaceholderCallbackFont implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 獲取camera對(duì)象
int cameraCount = Camera.getNumberOfCameras();
if (cameraCount == 2) {
camera2 = Camera.open(1);
}
try {
// 設(shè)置預(yù)覽監(jiān)聽(tīng)
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);
// 啟動(dòng)攝像頭預(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ù)對(duì)焦
setDispaly(parameters, camera2);
camera2.setParameters(parameters);
camera2.startPreview();
camera2.cancelAutoFocus();// 2如果要實(shí)現(xiàn)連續(xù)的自動(dòng)對(duì)焦,這一句必須加上
camera.cancelAutoFocus();// 只有加上了這一句,才會(huì)自動(dòng)對(duì)焦。
}
}
});
}
@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", "圖像出錯(cuò)");
}
}
}
}
可能出現(xiàn)的問(wèn)題:
1、沒(méi)有權(quán)限,需要手動(dòng)打開(kāi),代碼里由于追求簡(jiǎn)便,沒(méi)有主動(dòng)申請(qǐng),只在mainfest中注冊(cè)了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android調(diào)用外置攝像頭的方法
- Android調(diào)用手機(jī)攝像頭拍照和錄音功能
- Android實(shí)現(xiàn)調(diào)用手機(jī)攝像頭錄像限制錄像時(shí)長(zhǎng)
- Android調(diào)用手機(jī)攝像頭的方法
- Android實(shí)現(xiàn)調(diào)用攝像頭拍照并存儲(chǔ)照片
- Android實(shí)現(xiàn)調(diào)用攝像頭拍照與視頻功能
- Android實(shí)現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能
- Android開(kāi)發(fā)教程之調(diào)用攝像頭功能的方法詳解
- android開(kāi)發(fā)之調(diào)用手機(jī)的攝像頭使用MediaRecorder錄像并播放
- Androidstudio調(diào)用攝像頭拍照并保存照片
相關(guān)文章
Android基于開(kāi)源項(xiàng)目xutils3實(shí)現(xiàn)下載
這篇文章主要介紹了Android基于開(kāi)源項(xiàng)目xutils3實(shí)現(xiàn)下載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Android AutoCompleteTextView控件使用實(shí)例
AutoCompleteTextView這個(gè)控件用于輸入框的自動(dòng)完成提示,非常適合搜索框等。它本質(zhì)上是個(gè)EditText,實(shí)際上它也是從EditText繼承的,使用起來(lái)也十分簡(jiǎn)單2014-04-04
Android BroadcastReceiver實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)實(shí)時(shí)監(jiān)聽(tīng)
這篇文章主要為大家詳細(xì)介紹了Android BroadcastReceiver實(shí)現(xiàn)網(wǎng)絡(luò)狀態(tài)實(shí)時(shí)監(jiān)聽(tīng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android?WebView開(kāi)發(fā)之自定義WebView工具框
在WebView頁(yè)面長(zhǎng)按時(shí)會(huì)彈出一個(gè)復(fù)制框,有的時(shí)候里面的item不是我們想要,這個(gè)時(shí)候我們就可以自定義一個(gè)工具框。本文就將介紹如何通過(guò)WebView自定義工具框,需要的朋友可以參考一下2021-12-12
深入剖析Android的Volley庫(kù)中的圖片加載功能
這篇文章主要介紹了Android的Volley框架中的圖片加載功能,從源碼剖析了Volley加載圖片時(shí)的請(qǐng)求隊(duì)列處理等方面,需要的朋友可以參考下2016-04-04
Android自定義wheelview隨機(jī)選號(hào)效果
這篇文章主要介紹了Android自定義wheelview隨機(jī)選號(hào)效果,利用wheelview實(shí)現(xiàn)滾動(dòng)隨機(jī)選擇號(hào)碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android自定義View 實(shí)現(xiàn)水波紋動(dòng)畫(huà)引導(dǎo)效果
在android程序開(kāi)發(fā)中,我們經(jīng)常簡(jiǎn)單通過(guò)自定義view實(shí)現(xiàn)水波紋動(dòng)畫(huà)引導(dǎo)功能,下面通過(guò)本文給大家分享實(shí)現(xiàn)代碼,需要的朋友參考下2017-01-01
Android中EditText和AutoCompleteTextView設(shè)置文字選中顏色方法
這篇文章主要介紹了Android中EditText和AutoCompleteTextView設(shè)置文字選中顏色方法,本文給出了效果圖和實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01

