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