[英]Switch Cameras on Android using Camera API
您好,我是 Camera API 的新手。 我正在自學! 我只想將我的相機前后切換! 我的設備確實有前后攝像頭! 我這樣做是這樣的:
public class CameraFrag extends Fragment {
//Variables
private Camera mCamera;
private CameraPreview mPreview;
private ToggleButton flipCamera;
////////////////////////////////////
public CameraFrag() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//inflate the layout
View v = inflater.inflate(R.layout.frag, container, false);
flipCamera = (ToggleButton) v.findViewById(R.id.flipper);
// Create an instance of Camera
mCamera = getCameraInstance();
// Create our Preview view and set it as the content of our activity.
mPreview = new CameraPreview(getContext(), mCamera);
FrameLayout preview = (FrameLayout) v.findViewById(R.id.camera_preview);
preview.addView(mPreview);
flipCamera.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
try{
mCamera.stopPreview();
if(isChecked){
mCamera=openFrontFacingCamera();
}
else{
mCamera=openBackFacingCamera();
}
mCamera.startPreview();
}catch(Exception exp){
Log.i("#LOGTAG","EXCEPTION "+exp);
}
}
});
return v;
}
private Camera openBackFacingCamera() {
int cameraCount = 0;
Camera cam = null;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
cam = Camera.open(camIdx);
}
}
return cam;
}
private Camera openFrontFacingCamera() {
int cameraCount = 0;
Camera cam = null;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras();
for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
cam = Camera.open(camIdx);
}
}
return cam;
}
/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open(); // attempt to get a Camera instance
}
catch (Exception e){
// Camera is not available (in use or does not exist)
}
return c; // returns null if camera is unavailable
}
}
問題是它總是拋出一個異常:
I/#LOGTAG: EXCEPTION java.lang.RuntimeException: 連接相機服務失敗
如果我使用我的代碼:
try{
mCamera.stopPreview();
mCamera.release();
if(isChecked){
mCamera=openFrontFacingCamera();
}
else{
mCamera=openBackFacingCamera();
}
mCamera.startPreview();
}catch(Exception exp){
Log.i("#LOGTAG","EXCEPTION "+exp);
}
當我單擊返回按鈕時,我的預覽凍結並返回!
我在做什么錯? 在相機之間切換是否正確? 有人可以幫我嗎?
提前致謝!
只需打開所需的相機,如下所示:
對於前置攝像頭:
c = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
對於后置攝像頭:
c = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
並確保在完成后始終釋放相機或使用以下代碼釋放片段的onPause方法,否則相機實例將永遠不會被釋放,甚至您的主相機應用程序也無法獲取它。
private void releaseCameraAndPreview() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
對於將來面臨同樣問題的任何人。 當相機已經在使用時會發生錯誤,我通過首先釋放相機然后將其設置為空並再次打開它來解決問題。
//for front camera
camera.release();
camera = null;
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
//for back camera
camera.release();
camera = null;
camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.