0
我正在製作自定義相機應用程序。我想實現自定義預覽。 預覽僅在第一次打開後纔會始終顯示黑屏。 如果有人知道爲什麼請幫助我!如何在android中創建相機自定義預覽
我的相機類:
public class CamTestActivity extends Activity {
private static final String TAG = "CamTestActivity";
Preview preview;
Camera camera;
int cameraId;
SurfaceView sv;
private int rotation;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
cameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
sv = (SurfaceView) findViewById(R.id.surfaceView);
preview = new Preview(this, sv);
preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
((RelativeLayout) findViewById(R.id.layout)).addView(preview);
preview.setKeepScreenOn(true);
// holder = sv.getHolder();
}
@Override
protected void onResume() {
super.onResume();
openCamera(cameraId);
}
public boolean openCamera(int id) {
boolean result = false;
cameraId = id;
releaseCamera();
try {
camera = Camera.open(cameraId);
}
catch (Exception e) {
e.printStackTrace();
}
if (camera != null) {
try {
setUpCamera(camera);
camera.setErrorCallback(new ErrorCallback() {
@Override
public void onError(int error, Camera camera) {
}
});
camera.setPreviewDisplay(preview.mHolder);
camera.startPreview();
result = true;
}
catch (IOException e) {
e.printStackTrace();
result = false;
releaseCamera();
}
}
return result;
}
private void setUpCamera(Camera c) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
rotation = getWindowManager().getDefaultDisplay().getRotation();
int degree = 0;
switch (rotation) {
case Surface.ROTATION_0:
degree = 0;
break;
case Surface.ROTATION_90:
degree = 90;
break;
case Surface.ROTATION_180:
degree = 180;
break;
case Surface.ROTATION_270:
degree = 270;
break;
default:
break;
}
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
// frontFacing
rotation = (info.orientation + degree) % 330;
rotation = (360 - rotation) % 360;
}
else {
// Back-facing
rotation = (info.orientation - degree + 360) % 360;
}
c.setDisplayOrientation(rotation);
Parameters params = c.getParameters();
// showFlashButton(params);
List<String> focusModes = params.getSupportedFlashModes();
if (focusModes != null) {
if (focusModes
.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
params.setFlashMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
}
params.setRotation(rotation);
}
private void releaseCamera() {
try {
if (camera != null) {
camera.setPreviewCallback(null);
camera.setErrorCallback(null);
camera.stopPreview();
camera.release();
camera = null;
}
}
catch (Exception e) {
e.printStackTrace();
Log.e("error", e.toString());
camera = null;
}
}
}
請點擊此http://developer.android.com/guide/topics/media/camera.html – deniz
'Camera.open()'可能需要一段時間。 Google建議不要在UI線程上進行此調用。 –
請花一些時間閱讀[幫助頁面](http://stackoverflow.com/help),特別是名爲「我可以問什麼問題?」的部分?和「我應該避免問什麼類型的問題?」。更重要的是,請閱讀[Stack Overflow問題清單](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)。您可能還想了解[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – galath