您的位置:首页 > 其它

service中调用摄像头在无页面显示的情况下进行录像

2018-03-26 17:20 309 查看
service中的代码:
public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback {

private WindowManager windowManager;
private SurfaceView surfaceView;
private Camera camera = null;
private MediaRecorder mediaRecorder = null;

@Override
public void onCreate() {

// Start foreground service to avoid unexpected kill
Notification notification = new Notification.Builder(this)
.setContentTitle("Background Video Recorder")
.setContentText("")
.setSmallIcon(R.drawable.timg)
.build();
startForeground(1234, notification);

// Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback
windowManager = (WindowManager) BackgroundVideoRecorder.this.getSystemService(Context.WINDOW_SERVICE);
surfaceView = new SurfaceView(this);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
1, 1,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT
);

//全屏显示在最上图层上
// final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
// WindowManager.LayoutParams.WRAP_CONTENT,
// WindowManager.LayoutParams.WRAP_CONTENT,
// WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
// WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
// | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
// | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
// PixelFormat.TRANSLUCENT
// );

layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
windowManager.addView(surfaceView, layoutParams);
surfaceView.getHolder().addCallback(this);

}

// Method called right after Surface created (initializing and starting MediaRecorder)
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {

mediaRecorder = new MediaRecorder();
camera = Camera.open(1);
if (camera != null) {
camera.unlock();
mediaRecorder.setCamera(camera);
}
// 这两项需要放在setOutputFormat之后
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Set output file format
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

mediaRecorder.setVideoSize(640, 480);
mediaRecorder.setVideoFrameRate(30);
mediaRecorder.setVideoEncodingBitRate(1024 * 1024);
mediaRecorder.setOrientationHint(90);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

mediaRecorder.setOutputFile(
Environment.getExternalStorageDirectory() + "/" +
DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime()) +
".mp4"
);

try {

mediaRecorder.prepare();
mediaRecorder.start();
} catch (Exception e) {
Log.e("mediaRecorder", e.toString());
camera.release();
}

}

// Stop recording and remove SurfaceView
@Override
public void onDestroy() {

mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();

camera.lock();
camera.release();

windowManager.removeView(surfaceView);

}

@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
}

@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}记得在AndroidManifest.xml中添加权限:

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

有些人可能会因为权限不全而报一下错误:

 android.view.WindowManager$BadTokenException:
Unable to add window android.view.ViewRootImpl$W@1a04061c -- permission denied for this window type
添加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />  
这部分代码有什么问题可以在下评论
也可以参考下:https://blog.csdn.net/qq_36818970/article/details/79726668

源码

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MediaRecorder
相关文章推荐