(一)android 桌面悬浮窗 录屏源码放送

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuxingchong/article/details/86605037

看到几个网友留言需要源码参考,需要的可以拿走:

这里先提供几个工具类:

1.录屏工具类ScreenUtil.java

package com.android.systemui.util;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.widget.Toast;
import com.android.systemui.ScreenRecordService;

import com.android.systemui.R;
import android.app.Application;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;

public class ScreenUtil {

    private final static String TAG = "ScreenUtil";

    private static ScreenRecordService mScreenRecordService;

    private static List<RecordListener> mRecordListener = new ArrayList<>();

    private static List<OnPageRecordListener> mPageRecordListener = new ArrayList<>();

    public static boolean mIsRecordingTipShowing = false;

    /**
     * Only after the 5 version of the screen can be used
     * @return
     */
    public static boolean isScreenRecordEnable(){
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ;

    }


    public static void setScreenService(ScreenRecordService screenService){
        mScreenRecordService = screenService;
    }

    public static void clear(){
        if ( isScreenRecordEnable() && mScreenRecordService != null){
            mScreenRecordService.clearAll();
            mScreenRecordService = null;

        }

        if (mRecordListener != null && mRecordListener.size() > 0){
            mRecordListener.clear();
        }

        if (mPageRecordListener != null && mPageRecordListener.size() > 0 ){
            mPageRecordListener.clear();
        }
    }

    public static void startScreenRecord(Activity activity,int requestCode) {
        Log.d(TAG,"startScreenRecord isScreenRecordEnable() = "+isScreenRecordEnable()+" mScreenRecordService = "+mScreenRecordService);
        clearRecordElement();
        if (isScreenRecordEnable()){

            if (mScreenRecordService != null && !mScreenRecordService.ismIsRunning()){

                if (!mScreenRecordService.isReady()){

                    MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) activity.
                            getSystemService(Context.MEDIA_PROJECTION_SERVICE);
                    if (mediaProjectionManager != null){
                        Intent intent = mediaProjectionManager.createScreenCaptureIntent();
                        PackageManager packageManager = activity.getPackageManager();
                        if (packageManager.resolveActivity(intent,PackageManager.MATCH_DEFAULT_ONLY) != null){
                            Log.d(TAG,"startScreenRecord start");
                            activity.startActivityForResult(intent,requestCode);
                        }else {
                            Toast.makeText(activity,R.string.can_not_record_tip,Toast.LENGTH_SHORT).show();
                        }
                    }

                } else {
                    mScreenRecordService.startRecord();

                }

            }
        }

    }

    /**
     * After obtaining the user permission screen, set the necessary data.
     * @param resultCode
     * @param resultData
     */
    public static void setUpData(int resultCode,Intent resultData) throws Exception{

        if (isScreenRecordEnable()){

            if (mScreenRecordService != null && !mScreenRecordService.ismIsRunning()){
                mScreenRecordService.setResultData(resultCode,resultData);
                mScreenRecordService.startRecord();
            }
        }
    }

    /**
     * stop record screen
     */
    public static void stopScreenRecord(Context context){
        Log.d(TAG,"stopScreenRecord mScreenRecordService = "+isScreenRecordEnable());
        if (isScreenRecordEnable()){
            if(mScreenRecordService != null)
                Log.d(TAG,"stopScreenRecord mScreenRecordService.ismIsRunning() = "+mScreenRecordService.ismIsRunning());
            if (mScreenRecordService != null && mScreenRecordService.ismIsRunning()){
                String str = context.getString(R.string.record_video_tip);
                mScreenRecordService.stopRecord(str);
            }
        }
    }

    public static void stopScreenRecord(){
        Log.d(TAG,"stopScreenRecord mScreenRecordService = "+isScreenRecordEnable(),new Throwable());
        if (isScreenRecordEnable()){
            if(mScreenRecordService != null)
                Log.d(TAG,"stopScreenRecord mScreenRecordService.ismIsRunning() = "+mScreenRecordService.ismIsRunning());
            if (mScreenRecordService != null && mScreenRecordService.ismIsRunning()){
                mScreenRecordService.stopRecord("stop");
            }
        }
    }

    public static boolean isRecordScreen(){
        if (mScreenRecordService != null && mScreenRecordService.ismIsRunning()){
            return true;
        }
        return false;
    }

    /**
     * record file save  path
     * @return
     */
    public static String getScreenRecordFilePath(){

        if (isScreenRecordEnable() && mScreenRecordService!= null) {
            return mScreenRecordService.getRecordFilePath();
        }
        return null;

    }

    /**
     * Determine whether or not it is currently being recorded
     * @return
     */
    public static boolean isCurrentRecording(){
        if (isScreenRecordEnable() && mScreenRecordService!= null) {
            return mScreenRecordService.ismIsRunning();
        }
        return false;
    }

    /**
     * true,The hint at the end of the recording is showing
     * @return
     */
    public static boolean isRecodingTipShow(){
        return mIsRecordingTipShowing;
    }

    public static void setRecordingStatus(boolean isShow){
        mIsRecordingTipShowing = isShow;
    }


    /**
     * The system is recording, the app screen will be in conflict, and some data will be cleaned up.
     */
    public static void clearRecordElement(){

        if (isScreenRecordEnable()){
            if (mScreenRecordService != null ){
                mScreenRecordService.clearRecordElement();
            }
        }
    }

    public static void addRecordListener(RecordListener listener){

        if (listener != null && !mRecordListener.contains(listener)){
            mRecordListener.add(listener);
        }

    }

    public static void removeRecordListener(RecordListener listener){
        if (listener != null && mRecordListener.contains(listener)){
            mRecordListener.remove(listener);
        }
    }

    public static void addPageRecordListener( OnPageRecordListener listener){

        if (listener != null && !mPageRecordListener.contains(listener)){
            mPageRecordListener.add(listener);
        }
    }

    public static void removePageRecordListener( OnPageRecordListener listener){

        if (listener != null && mPageRecordListener.contains(listener)){
            mPageRecordListener.remove(listener);
        }
    }

    public static void onPageRecordStart(){
        if (mPageRecordListener!= null && mPageRecordListener.size() > 0 ){
            for (OnPageRecordListener listener : mPageRecordListener){
                listener.onStartRecord();
            }
        }
    }


    public static void onPageRecordStop(){
        if (mPageRecordListener!= null && mPageRecordListener.size() > 0 ){
            for (OnPageRecordListener listener : mPageRecordListener){
                listener.onStopRecord();
            }
        }
    }

    public static void onPageBeforeShowAnim(){
        if (mPageRecordListener!= null && mPageRecordListener.size() > 0 ){
            for (OnPageRecordListener listener : mPageRecordListener){
                listener.onBeforeShowAnim();
            }
        }
    }

    public static void onPageAfterHideAnim(){
        if (mPageRecordListener!= null && mPageRecordListener.size() > 0 ){
            for (OnPageRecordListener listener : mPageRecordListener){
                listener.onAfterHideAnim();
            }
        }
    }

    public static void startRecord(){
        if (mRecordListener.size() > 0 ){
            for (RecordListener listener : mRecordListener){
                listener.onStartRecord();
            }
        }
    }

    public static void pauseRecord(){
        if (mRecordListener.size() > 0 ){
            for (RecordListener listener : mRecordListener){
                listener.onPauseRecord();
            }
        }
    }

    public static void resumeRecord(){
        if (mRecordListener.size() > 0 ){
            for (RecordListener listener : mRecordListener){
                listener.onResumeRecord();
            }
        }
    }

    public static void onRecording(String timeTip){
        if (mRecordListener.size() > 0 ){
            for (RecordListener listener : mRecordListener){
                listener.onRecording(timeTip);
            }
        }
    }

    public static void stopRecord(String stopTip){
        if (mRecordListener.size() > 0 ){
            for (RecordListener listener : mRecordListener){
                listener.onStopRecord( stopTip);
            }
        }
    }

    public interface RecordListener{

        void onStartRecord();
        void onPauseRecord();
        void onResumeRecord();
        void onStopRecord(String stopTip);
        void onRecording(String timeTip);
    }


    public interface OnPageRecordListener {

        void onStartRecord();
        void onStopRecord();

        void onBeforeShowAnim();
        void onAfterHideAnim();
    }
}

2.录屏文件管理类FileUtil.java

package com.android.systemui.util;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;

import java.io.File;

public class FileUtil {

    /**
     * Delete files or directories in the SD card
     *
     * @param path
     * @return
     */
    public static boolean deleteSDFile(String path) {
        return deleteSDFile(path, false);
    }

    /**
     * Delete files or directories in the SD card
     *
     * @param path
     * @param deleteParent true为删除父目录
     * @return
     */
    public static boolean deleteSDFile(String path, boolean deleteParent) {
        if (TextUtils.isEmpty(path)) {
            return false;
        }

        File file = new File(path);
        if (!file.exists()) {
            return true;
        }
        return deleteFile(file, deleteParent);
    }

    /**
     *Create files or directories in the SD card
     *
     * *@param path
     * @return
     */
    public static boolean createSDFile(String path) {
        if (TextUtils.isEmpty(path)) {
            return false;
        }

        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
            return true;
        }
        return true;
    }

    /**
     * @param file
     * @param deleteParent true is delete parent directories
     * @return
     */
    public static boolean deleteFile(File file, boolean deleteParent) {
        boolean flag = false;
        if (file == null) {
            return flag;
        }
        if (file.isDirectory()) {
            //directories
            File[] files = file.listFiles();
            if (files.length > 0) {
                for (int i = 0; i < files.length; i++) {
                    flag = deleteFile(files[i], true);
                    if (!flag) {
                        return flag;
                    }
                }
            }
            if (deleteParent) {
                flag = file.delete();
            }
        } else {
            flag = file.delete();
        }
        file = null;
        return flag;
    }

    /**
     * Add to the media database
     *
     * @param context
     */
    public static Uri fileScanVideo(Context context, String videoPath, int videoWidth, int videoHeight,
                                    int videoTime) {

        File file = new File(videoPath);
        if (file.exists()) {

            Uri uri = null;

            long size = file.length();
            String fileName = file.getName();
            long dateTaken = System.currentTimeMillis();

            ContentValues values = new ContentValues(11);
            values.put(MediaStore.Video.Media.DATA, videoPath); // path;
            values.put(MediaStore.Video.Media.TITLE, fileName); // title;
            values.put(MediaStore.Video.Media.DURATION, videoTime * 1000); // time
            values.put(MediaStore.Video.Media.WIDTH, videoWidth); // width
            values.put(MediaStore.Video.Media.HEIGHT, videoHeight); // height
            values.put(MediaStore.Video.Media.SIZE, size); // size;
            values.put(MediaStore.Video.Media.DATE_TAKEN, dateTaken); // date;
            values.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);// filename;
            values.put(MediaStore.Video.Media.DATE_MODIFIED, dateTaken / 1000);// modify time;
            values.put(MediaStore.Video.Media.DATE_ADDED, dateTaken / 1000); // add time;
            values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");

            ContentResolver resolver = context.getContentResolver();

            if (resolver != null) {
                try {
                    uri = resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
                } catch (Exception e) {
                    e.printStackTrace();
                    uri = null;
                }
            }

            if (uri == null) {
                MediaScannerConnection.scanFile(context, new String[]{videoPath}, new String[]{"video/*"}, new MediaScannerConnection.OnScanCompletedListener() {
                    @Override
                    public void onScanCompleted(String path, Uri uri) {

                    }
                });
            }

            return uri;
        }

        return null;
    }

    /**
     * The SD card exists and can be used
     */
    public static boolean isSDExists() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    }

    /**
     * The residual capacity of the SD card is obtained, the unit is Byte
     *
     * @return
     */
    public static long getSDFreeMemory() {
        try {
            if (isSDExists()) {
                File pathFile = Environment.getExternalStorageDirectory();
                // Retrieve overall information about the space on a filesystem.
                // This is a Wrapper for Unix statfs().
                StatFs statfs = new StatFs(pathFile.getPath());
                // Get the SIZE of every block on the SDCard
                long nBlockSize = statfs.getBlockSize();
                // Getting the number of Block used by the program
                // long nAvailBlock = statfs.getAvailableBlocksLong();
                long nAvailBlock = statfs.getAvailableBlocks();
                // Calculating the remaining size of SDCard Byte
                long nSDFreeSize = nAvailBlock * nBlockSize;
                return nSDFreeSize;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }
}

3.CommonUtil.java

package com.android.systemui.util;

import android.app.Activity;
import android.util.DisplayMetrics;
import android.view.Display;
import android.content.Context;
import android.app.Application;
import android.view.WindowManager;

public class CommonUtil {

    private static int mScreenWidth;
    private static int mScreenHeight;

    private static int mScreenDpi;

    public static void init(Application activity){
        DisplayMetrics metric = new DisplayMetrics();
        WindowManager mWindowManager  = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
        mWindowManager.getDefaultDisplay().getMetrics(metric);
        mScreenWidth = metric.widthPixels; // 屏幕宽度(像素)
        mScreenHeight = metric.heightPixels; // 屏幕宽度(像素)
        mScreenDpi = metric.densityDpi;
    }

    public static int getScreenWidth(){
        return mScreenWidth;
    }

    public static int getScreenHeight(){
        return mScreenHeight;
    }

    public static int getScreenDpi(){
        return mScreenDpi;
    }
}

猜你喜欢

转载自blog.csdn.net/zhuxingchong/article/details/86605037