如何解决如何使用camera2 android访问外部相机
我正在尝试在 android(java) 中访问外部 USB 摄像头。我只能访问内部摄像头(前后)。我不明白该怎么做。
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Button switchCameraButton,external_camera;
private Camera mCamera;
private CameraPreview mCameraPreview;
private int currentCameraId;
TextView active_cam;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getIntent().hasExtra("camera_id")) {
currentCameraId = getIntent().getIntExtra("camera_id",CameraCharacteristics.LENS_FACING_FRONT);
} else {
currentCameraId = CameraCharacteristics.LENS_FACING_BACK;
}
switchCameraButton = (Button) findViewById(R.id.button_switch_camera);
external_camera=findViewById(R.id.button_external_cam);
active_cam=findViewById(R.id.ac_cam);
// switchCameraButton.setVisibility(Camera.getNumberOfCameras() > 1 ? View.VISIBLE : View.GONE);
/* Log.d(" ","------------------");
Log.d("Camera","Toatal Camera's "+Camera.getNumberOfCameras());
Log.d(" ","------------------");*/
/* try {
active_cam.setText("Activet camera's "+cameraManager.getCameraIdList().toString());
} catch (CameraAccessException e) {
e.printStackTrace();
}*/
// Toast.makeText(getApplicationContext(),""+Camera.getNumberOfCameras(),Toast.LENGTH_SHORT).show();
switchCameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.stopPreview();
//NB: if you don't release the current camera before switching,you app will crash
mCameraPreview.getHolder().removeCallback(mCameraPreview);
mCamera.release();
//swap the id of the camera to be used
if (currentCameraId == CameraCharacteristics.LENS_FACING_BACK) {
currentCameraId = CameraCharacteristics.LENS_FACING_FRONT;
} else {
currentCameraId = CameraCharacteristics.LENS_FACING_BACK;
}
count(currentCameraId);
mCamera = getCameraInstance(currentCameraId);
mCameraPreview = new CameraPreview(MainActivity.this,mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.removeAllViews();
preview.addView(mCameraPreview);
}
});
external_camera.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View v) {
mCamera.stopPreview();
mCameraPreview.getHolder().removeCallback(mCameraPreview);
mCamera.release();
/* int cameraId = -1;
int numberOfCameras = Camera.getNumberOfCameras();
for (int i = 0; i >numberOfCameras; i++) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(i,info);
if (info.facing == CameraCharacteristics.LENS_FACING_EXTERNAL) {
Log.d("DEBUG_TAG","Camera found");
cameraId = i;
break;
}
}
//String id="/dev/video16";
currentCameraId=cameraId;*/
CameraManager manager = null;
String cameraIndex = "2";
try {
for (String cameraId : manager.getCameraIdList()) {
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
Log.d("TAG","cameraId " + cameraId);
int cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING);
cameraIndex = cameraId;
}
} catch (Exception e) {
e.printStackTrace();
}
currentCameraId = Integer.parseInt(cameraIndex);
count(currentCameraId);
mCamera = getCameraInstance(currentCameraId);
mCameraPreview = new CameraPreview(MainActivity.this,mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.removeAllViews();
preview.addView(mCameraPreview);
}
});
}
private void count(int id) {
active_cam.setText("Current cam id :"+id);
}
@Override
protected void onResume() {
super.onResume();
mCamera = getCameraInstance(currentCameraId);
mCameraPreview = new CameraPreview(MainActivity.this,mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mCameraPreview);
}
private Camera getCameraInstance(int currentCameraId) {
Camera camera = null;
try {
camera = Camera.open(currentCameraId);
} catch (Exception e) {
// cannot get camera or does not exist
}
return camera;
}
}
相机预览
public class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
private SurfaceHolder mSurfaceHolder;
private Camera mCamera;
private boolean needToTakePic = false;
private Camera.AutoFocusCallback myAutoFocusCallback = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean arg0,Camera arg1) {
if (arg0) {
mCamera.cancelAutoFocus();
}
}
};
// Constructor that obtains context and camera
@SuppressWarnings("deprecation")
public CameraPreview(Context context,Camera camera) {
super(context);
this.mCamera = camera;
this.mSurfaceHolder = this.getHolder();
this.mSurfaceHolder.addCallback(this);
this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.getParameters().setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
} catch (IOException e) {
// left blank for now
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mCamera.stopPreview();
this.mSurfaceHolder.removeCallback(this);
mCamera.release();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder,int format,int width,int height) {
// start preview with new settings
try {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (Exception e) {
// intentionally left blank for a test
e.printStackTrace();
}
}
/**
* Called from PreviewSurfaceView to set touch focus.
*
* @param - Rect - new area for auto focus
*/
public void doTouchFocus(final Rect tfocusRect) {
try {
List<Camera.Area> focusList = new ArrayList<Camera.Area>();
Camera.Area focusArea = new Camera.Area(tfocusRect,1000);
focusList.add(focusArea);
Camera.Parameters param = mCamera.getParameters();
param.setFocusAreas(focusList);
param.setMeteringAreas(focusList);
mCamera.setParameters(param);
mCamera.autoFocus(myAutoFocusCallback);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
float x = event.getX();
float y = event.getY();
Rect touchRect = new Rect(
(int) (x - 100),(int) (y - 100),(int) (x + 100),(int) (y + 100));
final Rect targetFocusRect = new Rect(
touchRect.left * 2000 / this.getWidth() - 1000,touchRect.top * 2000 / this.getHeight() - 1000,touchRect.right * 2000 / this.getWidth() - 1000,touchRect.bottom * 2000 / this.getHeight() - 1000);
doTouchFocus(targetFocusRect);
}
return false;
}
public void setNeedToTakePic(boolean needToTakePic) {
this.needToTakePic = needToTakePic;
}
}
这是我的清单文件 (AndroidManifest.xml) 中的功能和权限列表:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
我在互联网上搜索了很多,但没有得到任何东西或示例代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。