android悬浮窗录像
package com.safeluck.floatwindow;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import java.io.IOException;
/**
* aaa
* Created by lzw on 2018/8/20. 14:16:54
* 邮箱:632393724@qq.com
* All Rights Saved! Chongqing AnYun Tech co. LTD
*/
public class FloatingService extends Service implements SurfaceHolder.Callback {
private static final String TAG = FloatingService.class.getCanonicalName();
private MediaRecorder mediaRecorder ;
private static final int RECORD_TIME_SEC = 60;
private SurfaceHolder surfaceHolder;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
audioManager.setStreamMute(AudioManager.STREAM_MUSIC,true);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, 0, 0);
audioManager.setStreamVolume(AudioManager.STREAM_DTMF, 0, 0);
audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, 0, 0);
audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0);
showFloatingWindow();
return super.onStartCommand(intent, flags, startId);
}
private void showFloatingWindow() {
//先判断是否有悬浮窗权限
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M){
if (Settings.canDrawOverlays(this)){
Log.i(TAG, "showFloatingWindow: >=M");
showwindow();
}
}else{
Log.i(TAG, "showFloatingWindow: <M");
showwindow();
}
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
this.surfaceHolder = surfaceHolder;
starter();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
button = null;
surfaceHolder= null;
mediaRecorder = null;
}
class FloatingTouchListener implements View.OnTouchListener{
private int x = 0;
private int y = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
x= (int)motionEvent.getRawX();
y = (int) motionEvent.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int nowX = (int)motionEvent.getRawX();
int nowY = (int) motionEvent.getRawY();
int movedX = nowX-x;
int moveY = nowY- y;
x = nowX;
y = nowY;
layoutParams.x = layoutParams.x + movedX;
layoutParams.y = layoutParams.y + moveY;
windowManager.updateViewLayout(button,layoutParams);
break;
case MotionEvent.ACTION_UP:
break;
default:
Log.i(TAG, "onTouch: "+motionEvent.getAction());
break;
}
return false;
}
}
private void init() {
mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setMaxDuration(RECORD_TIME_SEC*1000);
mediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
@Override
public void onInfo(MediaRecorder mediaRecorder, int arg1, int extra) {
switch (arg1){
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:
Log.i(TAG,"一分钟时间到");
stop();
starter();
break;
}
}
});
mediaRecorder.setVideoSize(480,360);
mediaRecorder.setVideoFrameRate(20);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/DCIM/"+System.currentTimeMillis()+".mp4");
}
private void starter() {
if (mediaRecorder == null){
init();
}
if (mediaRecorder != null){
try {
//准备录制
mediaRecorder.prepare();
//开始录制
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
stop();
}
private void stop() {
if(mediaRecorder != null){
//停止录制
mediaRecorder.stop();
//释放资源
mediaRecorder.release();
//引用置为空
mediaRecorder = null;
}
}
private WindowManager windowManager;
WindowManager.LayoutParams layoutParams;
SurfaceView button;
private void showwindow() {
if (windowManager == null)
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
button = new SurfaceView(this);
surfaceHolder = button.getHolder();
surfaceHolder.addCallback(this);
//setType必须设置,要不出错.
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
button.setOnTouchListener(new FloatingTouchListener());
button.setBackgroundColor(Color.TRANSPARENT);
//设置LayoutParams
layoutParams = new WindowManager.LayoutParams();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}else{
layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//不可获取焦点
layoutParams.format = PixelFormat.RGBA_8888; layoutParams.width = 100;
layoutParams.height = 100;
layoutParams.x = 300;
layoutParams.y = 300; //将悬浮窗添加到WindowManager windowManager.addView(button,layoutParams);
}
}
Dana.Lee
To:Dana_Lee1016@126.com
浙公网安备 33010602011771号