Java 我想在同一活动中停止摄影机源后重新启动它
我申请了条形码检测器,所以我使用SurfaceView来处理camerasource。在摄像头检测到条形码并返回其值后,我使其停止。没有函数可以在任何事件上重新启动摄影机源和曲面视图,只有一个函数,即camersource.start() 它启动了,但问题是它在后台工作,我看不到如何解决这个问题?并再次显示surfaceview和相机源。 下面是activityoncreate方法的全部代码Java 我想在同一活动中停止摄影机源后重新启动它,java,android,camera,surfaceview,Java,Android,Camera,Surfaceview,我申请了条形码检测器,所以我使用SurfaceView来处理camerasource。在摄像头检测到条形码并返回其值后,我使其停止。没有函数可以在任何事件上重新启动摄影机源和曲面视图,只有一个函数,即camersource.start() 它启动了,但问题是它在后台工作,我看不到如何解决这个问题?并再次显示surfaceview和相机源。 下面是activityoncreate方法的全部代码 @Override protected void onCreate(Bundle savedI
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.cameraPreview);
txtShow = (TextView) findViewById(R.id.txtShow);
startBarcode();
}
public void startBarcode() {
barcodeDetector = new BarcodeDetector.Builder(this)
.setBarcodeFormats(Barcode.ALL_FORMATS)
.build();
cameraSource = new CameraSource.Builder(this, barcodeDetector)
.setRequestedPreviewSize(800, 600)
.setAutoFocusEnabled(true)
.build();
//Events
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (ActivityCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//Make Request Runtime Permission
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA}, RequestCameraPermissionId);
return;
}
try {
cameraSource.start(surfaceView.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//Make Request Runtime Permission
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA}, RequestCameraPermissionId);
return;
}
try {
cameraSource.start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> qrCodes = detections.getDetectedItems();
if (qrCodes.size() != 0) {
txtShow.post(new Runnable() {
@Override
public void run() {
//create vibrate
Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(500);
//set result for Text View
txtShow.setText(qrCodes.valueAt(0).displayValue);
// surfaceView.setTop(200);
cameraSource.stop();
final MediaPlayer mp = MediaPlayer.create(MainActivity.this, R.raw.barcode);
mp.start();
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView=(surfaceView)findViewById(R.id.cameraPreview);
txtShow=(TextView)findViewById(R.id.txtShow);
startBarcode();
}
public void startBarcode(){
barcodeDetector=新的barcodeDetector.Builder(此)
.setBarcodeFormats(条形码.所有_格式)
.build();
cameraSource=新建cameraSource.Builder(这是barcodeDetector)
.setRequestedPreviewSize(800600)
.setAutoFocusEnabled(真)
.build();
//事件
surfaceView.getHolder().addCallback(新的SurfaceHolder.Callback()){
@凌驾
已创建的公共空白表面(表面持有人){
if(ActivityCompat.checkSelfPermission(getApplicationContext(),android.Manifest.permission.CAMERA)!=PackageManager.permission\u已授予){
//请求运行时权限
ActivityCompat.requestPermissions(MainActivity.this,
新字符串[]{Manifest.permission.CAMERA},RequestCameraPermissionId);
返回;
}
试一试{
开始(surfaceView.getHolder());
}捕获(IOE异常){
e、 printStackTrace();
}
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
if(ActivityCompat.checkSelfPermission(MainActivity.this、Manifest.permission.CAMERA)!=PackageManager.permission\u已授予){
//请求运行时权限
ActivityCompat.requestPermissions(MainActivity.this,
新字符串[]{Manifest.permission.CAMERA},RequestCameraPermissionId);
返回;
}
试一试{
cameraSource.start();
}捕获(IOE异常){
e、 printStackTrace();
}
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
cameraSource.stop();
}
});
条形码检测器.setProcessor(新检测器.Processor(){
@凌驾
公开无效释放(){
}
@凌驾
公共空隙接收检测(检测器。检测){
最终SparseArray qrCodes=检测。getDetectedItems();
如果(qrCodes.size()!=0){
post(新的Runnable(){
@凌驾
公开募捐{
//制造振动
可控震源可控震源=(可控震源)getApplicationContext().getSystemService(Context.可控震源\u服务);
振动器。振动器(500);
//设置文本视图的结果
txtShow.setText(qrCodes.valueAt(0.displayValue));
//surfaceView.setTop(200);
cameraSource.stop();
最终MediaPlayer mp=MediaPlayer.create(MainActivity.this,R.raw.barcode);
mp.start();
要在cameraSource.stop()之后重新启动,您需要:
cameraSource.start(surfaceView.getHolder());
捕获代码后,您可以停止相机源并重新启动OnCreate methode。或者,您可以使用以下意图再次调用活动:
Intent intent= new Intent (getBaseContext,MainActivity.class); // your activity
startActivity(intent);
如果我没有停止camera source,它将连续工作而不停止。尝试一种简单的方法:当你停止cameraService时,删除surfaceView;当你想重新启动时,只需向你的内容视图添加一个新的surfaceView。@AlexCohn这是一个好主意,但如何删除它并添加新的一个来删除,你可以参考以下答案:。要添加surfaceView sm哦,你可以保留旧相机预览的布局参数。@AlexCohn如果你能给我展示解决方案,我不知道,我会很感激你的。我在重新开始之前尝试过这个方法,但它在后台运行,正如你在我的问题中看到的,相机源仍然停止并且没有重新启动,所以相机源仍然停止我的问题是如何在特定条件下重新启动surfaceview和camera source,如单击按钮。它工作正常,是否有其他方法可以更轻松地完成此操作。