需要帮助添加按钮或ImageView,以便我可以切换到前置摄像头,请帮助! 任何人都可以帮助我,并快速尝试添加它,但我一直在交换机相机上出现错误。我尝试实现一个与前置摄像头分开的类的意图,但是当切换回后置摄像头时,屏幕将保持黑色。如果有人能帮助我,我想以正确的方式实现前置摄像头。如果您愿意,可以请将前置摄像头源代码添加到我的项目中。如果可以的话。
ImageView cameraFront;
private int width, height;
private int sdkVersion;
private int timeCount = 0;
private int PORTRAIT = 0;
private int PORTRAIT_REV = 1;
private int LANDSCAPE_RIGHT = 2;
private int LANDSCAPE_LEFT = 3;
private SurfaceView surface;
private SurfaceHolder surfaceHolder;
private MediaRecorder videoRecorder;
private Button recordBtn;
private TextView timeView;
private String videoPath;
private Timer autoStopTimer;
private Camera mCamera;
private Camera.Parameters parameters;
private List<Size> supportedSizes = null;
private SensorManager sensorManager = null;
private boolean isRecording = false;
boolean changeOrientation = false;
int mDetected_Orientention = 0;
Tosty toast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
try {
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
setContentView(R.layout.video_recorder);
videoPath = getIntent().getStringExtra("videoPath");
width = getIntent().getIntExtra("Width", 320);
height = getIntent().getIntExtra("Height", 240);
WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Display mDisplay = mWindowManager.getDefaultDisplay();
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
toast = new Tosty(VideoRecorder.this);
recordBtn = (Button) findViewById(R.id.recordBtn);
recordBtn.setOnClickListener(this);
surface = (SurfaceView) findViewById(R.id.surfaceView);
surfaceHolder = surface.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
timeView = (TextView) findViewById(R.id.timeView);
timeView.setTextColor(Color.WHITE);
initVideoRecording();
initView();
setListener();
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void initView() {
cameraFront = (ImageView) findViewById(R.id.cameraSwitch1);
}
public void setListener() {
cameraFront.setOnClickListener(this);
}
@Override
protected void onResume() {
super.onResume();
(new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
try {
initVideoRecording();
//finish();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
})).start();
}
@Override
public void onDestroy() {
super.onDestroy();
// Stop sensorManager
sensorManager.unregisterListener(VideoRecorder.this);
if (autoStopTimer != null) {
autoStopTimer.cancel();
autoStopTimer.purge();
autoStopTimer = null;
}
try {
stopVideoRecording();
}
catch (Exception e) {
// TODO Auto-generated catch block
}
}
@Override
public void onPause() {
super.onPause();
if (autoStopTimer != null) {
autoStopTimer.cancel();
autoStopTimer.purge();
autoStopTimer = null;
}
try {
stopVideoRecording();
}
catch (Exception e) {
// TODO Auto-generated catch block
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// toast.showToast("Back button is pressed");
sensorManager.unregisterListener(VideoRecorder.this);
finish();
return true;
}
else if (keyCode == KeyEvent.KEYCODE_HOME) {
try {
stopVideoRecording();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return super.onKeyDown(keyCode, event);
}
public void onBackPressed() {
startActivity(new Intent(this, VideoPlay.class)
.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
//overridePendingTransition(R.anim.left_right, R.anim.right_left);
finish();
return;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.cameraSwitch1:
Intent intent = new Intent(VideoRecorder.this, Cemara.class);
//intent.putExtra("android.intent.extras.CAMERA_FACING", 1);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
//intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
finish();
startActivity(intent);
break;
}
if (v == recordBtn) {
try {
if (isRecording) {
if (autoStopTimer != null) {
autoStopTimer.cancel();
autoStopTimer.purge();
autoStopTimer = null;
}
try {
stopVideoRecording();
}
catch (Exception e) {
// TODO Auto-generated catch block
}
setResult(RESULT_OK);
finish();
}
else {
startVideoRecording();
autoStopTimer = new Timer();
autoStopTimer.schedule(new TimerTask() {
public void run() {
timeCount++;
runOnUiThread(new Runnable() {
public void run() {
timeView.setText(String.format("00:%02d", timeCount));
if (timeCount == 31) {
try {
stopVideoRecording();
}
catch (Exception e) {
// TODO Auto-generated catch block
}
setResult(RESULT_OK);
finish();
}
}
});
if (timeCount == 31) {
autoStopTimer.cancel();
autoStopTimer = null;
}
}
}, 1000, 1000);
}
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
private void initVideoRecording() {
try {
if (videoRecorder != null) {
videoRecorder.stop();
videoRecorder.release();
videoRecorder = null;
}
if (mCamera != null) {
mCamera.reconnect();
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
sdkVersion = Build.VERSION.SDK_INT;
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(0, info);
mCamera = Camera.open();
//parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
//parameters.set("focus-mode", "continuous-video");
//mCamera.setParameters(parameters);
// Camera setup is based on the API Camera Preview demo
mCamera.setPreviewDisplay(surfaceHolder);
parameters = mCamera.getParameters();
if (sdkVersion <= 8) {
supportedSizes = parameters.getSupportedVideoSizes();
}
// parameters.setRotation(90);
mCamera.setParameters(parameters);
// check the intial orientation depending on rotation
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int nCurrentOrientation = _getScreenOrientation();
if (nCurrentOrientation == Configuration.ORIENTATION_PORTRAIT && rotation == Surface.ROTATION_0) {
System.out.println("We are in portrait mode");
// parameters.setRotation(0);
mCamera.setDisplayOrientation(90);
}
else if (nCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE && rotation == Surface.ROTATION_90) {
System.out.println("We are in landscape mode");
// parameters.setRotation(0);
mCamera.setDisplayOrientation(0);
}
else if (nCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE && rotation == Surface.ROTATION_270) {
System.out.println("Reverse Landscape Mode");
mCamera.setDisplayOrientation(180);
}
else if (nCurrentOrientation == Configuration.ORIENTATION_PORTRAIT && rotation == Surface.ROTATION_180) {
System.out.println("Reverse potrait mode");
mCamera.setDisplayOrientation(90);
}
else
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
mCamera.unlock();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void stopVideoRecording() throws Exception {
try {
if (videoRecorder != null) {
videoRecorder.stop();
videoRecorder.release();
videoRecorder = null;
}
if (mCamera != null) {
mCamera.reconnect();
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private void startVideoRecording() {
try {
if (videoRecorder == null) {
videoRecorder = new MediaRecorder();
}
videoRecorder.setCamera(mCamera);
videoRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
videoRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
videoRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
videoRecorder.setAudioEncodingBitRate(128000);
videoRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
videoRecorder.setAudioChannels(1);
videoRecorder.setAudioSamplingRate(48000);
if (width == 1280) {
videoRecorder.setVideoEncodingBitRate(22100000);
}
else if (width == 720) {
videoRecorder.setVideoEncodingBitRate(3508000);
}
else {
videoRecorder.setVideoEncodingBitRate(777000);
}
videoRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
videoRecorder.setVideoFrameRate(30);
videoRecorder.setVideoSize(width, height);
videoRecorder.setPreviewDisplay(surfaceHolder.getSurface());
videoRecorder.setOrientationHint(90);
if (mDetected_Orientention == PORTRAIT) {
videoRecorder.setOrientationHint(90);
}
else if (mDetected_Orientention == PORTRAIT_REV) {
videoRecorder.setOrientationHint(270);
}
else if (mDetected_Orientention == LANDSCAPE_RIGHT) {
videoRecorder.setOrientationHint(180);
}
try {
videoRecorder.setOutputFile(videoPath);
videoRecorder.prepare();
videoRecorder.start();
isRecording = true;
recordBtn.setText("STOP");
}
catch (Exception e) {
Log.e("Video", "Failed to prepare and start video recording", e);
videoRecorder.release();
videoRecorder = null;
}
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
try {
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int nCurrentOrientation = _getScreenOrientation();
if (nCurrentOrientation == Configuration.ORIENTATION_PORTRAIT && rotation == Surface.ROTATION_0) {
System.out.println("We are in portriat mode");
// parameters.setRotation(0);
mCamera.setDisplayOrientation(90);
Log.e("Rotation", "90");
}
else if (nCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE && rotation == Surface.ROTATION_90) {
System.out.println("We are in landscape mode");
// parameters.setRotation(0);
Log.e("Rotation", "0");
mCamera.setDisplayOrientation(0);
}
else if (nCurrentOrientation == Configuration.ORIENTATION_LANDSCAPE && rotation == Surface.ROTATION_270) {
System.out.println("Reverse Landscape Mode");
Log.e("Rotation", "180");
mCamera.setDisplayOrientation(180);
}
else if (nCurrentOrientation == Configuration.ORIENTATION_PORTRAIT && rotation == Surface.ROTATION_180) {
System.out.println("Reverse potrait mode");
Log.e("Rotation", "90");
mCamera.setDisplayOrientation(90);
}
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
// _doSomeThingWhenChangeOrientation(nCurrentOrientation);
}
private int _getScreenOrientation() {
int returnOrientation = 0;
try {
returnOrientation = getResources().getConfiguration().orientation;
}
catch (Exception e) {
System.out.println(e.getMessage());
}
return returnOrientation;
}
int orientation = -1;
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
float x = sensorEvent.values[0];
float y = sensorEvent.values[1];
if (x >= -5 && x < 5) {
if (y > 0) {
mDetected_Orientention = PORTRAIT;
//Log.e("X", "PORTRAIT");
}
else {
mDetected_Orientention = PORTRAIT_REV;
//Log.e("X", "PORTRAIT_REV");
}
}
else {
if (x >= -10 && x < -5) {
//Log.e("X", "LAND_RIGHT");
mDetected_Orientention = LANDSCAPE_RIGHT;
}
else {
//Log.e("X", "LEND_LEFT");
mDetected_Orientention = LANDSCAPE_LEFT;
}
}
}
}
答案 0 :(得分:1)
这个答案是从Commonsware tutorial/code sample抄袭的99%。我添加了一个在前后摄像头之间切换的按钮。
PreviewDemo.java
package com.commonsware.android.camera;
import java.io.IOException;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
public class PreviewDemo extends Activity {
private static final String TAG = PreviewDemo.class.getSimpleName();
private SurfaceView preview = null;
private SurfaceHolder previewHolder = null;
private Camera camera = null;
private boolean inPreview = false;
private boolean cameraConfigured = false;
int cameraID = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
preview = (SurfaceView) findViewById(R.id.preview);
previewHolder = preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@SuppressLint("NewApi")
@Override
public void onResume() {
super.onResume();
// camera = Camera.open();
camera = Camera.open(cameraID);
startPreview();
}
@Override
public void onPause() {
if (inPreview) {
camera.stopPreview();
}
camera.release();
camera = null;
inPreview = false;
super.onPause();
}
private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
Camera.Size result = null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width <= width && size.height <= height) {
if (result == null) {
result = size;
} else {
int resultArea = result.width * result.height;
int newArea = size.width * size.height;
if (newArea > resultArea) {
result = size;
}
}
}
}
return (result);
}
private void initPreview(int width, int height) {
if (camera != null && previewHolder.getSurface() != null) {
try {
camera.setPreviewDisplay(previewHolder);
} catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback", "Exception in setPreviewDisplay()", t);
Toast.makeText(PreviewDemo.this, t.getMessage(), Toast.LENGTH_LONG).show();
}
if (!cameraConfigured) {
Camera.Parameters parameters = camera.getParameters();
Camera.Size size = getBestPreviewSize(width, height, parameters);
if (size != null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
cameraConfigured = true;
}
}
}
}
private void startPreview() {
Log.d(TAG, "start preview called");
if (cameraConfigured && camera != null) {
Log.d(TAG, "stuff works");
camera.startPreview();
inPreview = true;
}
}
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// no-op -- wait until surfaceChanged()
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
initPreview(width, height);
startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// no-op
}
};
@SuppressLint("NewApi")
public void switchCamera(View view) {
Log.d(TAG, "switch called");
if (inPreview) {
camera.stopPreview();
}
camera.release();
cameraID = (cameraID + 1) % 2;
camera = Camera.open(cameraID);
try {
camera.setPreviewDisplay(previewHolder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
}
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<android.view.SurfaceView
android:id="@+id/preview"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</android.view.SurfaceView>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="switch"
android:layout_alignParentBottom="true"
android:onClick="switchCamera" />
</RelativeLayout>