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
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
源码
相关文章推荐
- android 调用摄像头进行拍照,并对照片进行裁剪,然后显示。
- 调用系统摄像头拍照,对拍照后的图片进行裁剪和压缩处理,并显示在imageview上面
- Unity调用手机摄像头进行摄像,并显示
- 手机页面调用手机摄像头,录像、摄像、上传已有照片,安卓,苹果通用
- 在页面中嵌入Applet使用opencv调用摄像头,并显示实时摄像头内容
- HTML5——利用navigator+Video调用摄像头进行录像
- HTML5——利用navigator+Video调用摄像头进行录像
- 1怎样让输入的text文本填写的部分只添加数字、2怎样将输入的数字一次性全部删除 3怎样选择密码 让它不显示 4 怎样实现在没有return的情况下点击button的情况下就能够使键盘页面下落5 怎样实现点击指定的button来对使指定的text进行键盘弹出 6怎样改变button按钮的状态
- 使用Opencv调用摄像头并在MFC中进行视频显示
- Silverlight调用自定义的Web Service从数据库获取数据进行页面绑定
- JACOB调用WORD书签修改WORD文档,并生成html显示到页面中
- 【OpenCV学习】摄像头显示、录像、拍照程序
- ECShop新建页面并进行分页显示
- android开发(19) 调用手机的摄像头录像,并播放。
- Vue2.0 引用 exif.js 实现调用摄像头进行拍照功能以及图片上传功能
- PHP将页面中点击数量高的链接进行高亮显示的方法
- C#中的WinForm调用控制台进行信息显示
- OpenCV调用摄像头录像并保存下来
- android ImageView 视屏幕情况 使图片在限定范围内进行缩放显示
- Unity3d,调用摄像头显示