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);
}
}

  

posted on 2018-08-24 14:49  endian11  阅读(432)  评论(0编辑  收藏  举报

导航