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

这里先提供几个工具类:

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()) {//directoriesFile[] 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); // timevalues.put(MediaStore.Video.Media.WIDTH, videoWidth); // widthvalues.put(MediaStore.Video.Media.HEIGHT, videoHeight); // heightvalues.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() {@Overridepublic 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 SDCardlong 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 Bytelong 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;}
}

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

(一)android 桌面悬浮窗 录屏源码放送相关推荐

  1. android 桌面悬浮窗 录屏时间控制显示效果

    悬浮窗效果如上图所示: 很简单的一个布局直接上代码 悬浮窗是在service中拉起可以根据个人需要修改 代码: (一)android 桌面悬浮窗 录屏源码放送 (二)android 桌面悬浮窗 录屏源 ...

  2. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    转载自:http://blog.csdn.net/guolin_blog/article/details/8689140 大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我 ...

  3. Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现

    这次我们将代码的重点放在火箭升空的效果上,因此简单起见,就直接在模仿360手机卫士悬浮窗的那份代码的基础上继续开发了,如果你还没有看过那篇文章的话,建议先去阅读 Android桌面悬浮窗效果实现,仿3 ...

  4. Android桌面悬浮窗仿QQ手机管家加速效果

    主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...

  5. Android桌面悬浮窗

    这是一篇Android悬浮窗的介绍,能够实现例如360,QQ管家那样的悬浮窗效果.后台运行了一个服务,用于控制在运行非桌面app情况下隐藏悬浮窗. 下面先上Demo截图: 上图就是所实现的简单悬浮窗示 ...

  6. android桌面悬浮窗,Android桌面悬浮窗

    经常,我们看到在桌面上可移动的悬浮窗,这种场景还是很多的, 像流量统计,桌面歌词等,安全软件的清理小部件 这种小部件主要是通过 WindowManager ; WindowManager.Layout ...

  7. android使用RTMP实现录屏直播推送音视频(已在享学公众号发表)

    目录 一.MediaCodec编码音频 创建音频编码器,指定AAC格式,采样率44100,码率64_000,单声道: 创建AudioRecord录音对象,设置参数与编码器对应: 启动编码器和录音器: ...

  8. 安卓项目实战之Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    https://blog.csdn.net/guolin_blog/article/details/8689140

  9. Android WindowManger实现桌面悬浮窗

    文章目录 效果图 使用WindowManager实现 分析 问题 参考 如果想实现一个在桌面显示的悬浮窗,用Dialog.PopupWindow.Toast等已经不能实现了,他们基本都是在Activi ...

最新文章

  1. 软件测试之功能测试详细过程
  2. 以太坊PHP离线交易开发包
  3. java 面向组件_Java 面向对象
  4. CentOS 8 正式发布
  5. mysql复制功能介绍
  6. 得到频域波形的坐标数组_10. 频域法之序
  7. SAP CRM settype的创建,背后发生了什么
  8. 从头开始敲代码之《从BaseApplication/Activity开始》
  9. 贪心 BestCoder Round #39 1001 Delete
  10. ubuntu 的问题,我一个人使用,却显示两人登录?
  11. python的评分卡模型
  12. 用python设计数独的心得体会_Python生成数独矩阵
  13. 使用DevCpp/DevC++调试的设置和步骤
  14. 各浏览器中的 WebRTC 表现对比【转】
  15. shortcutwebsite
  16. mysql怎么创建外表_PostgreSQL使用MySQL外表的步骤详解(mysql_fdw)
  17. Android基于WIFI实现电脑和手机间数据传输的技术方案研究
  18. 解决Maven下载速度缓慢问题
  19. 从美术生到程序员转型之路【我的故事】
  20. IDEA中修改项目与Moudle名称方法总结

热门文章

  1. 花开再会,BIGBANG十周年回顾大展北京站于12月7日开幕
  2. mysql 实现查询用户连续登录的最大天数
  3. buuoj Pwn writeup 166-170
  4. 绝地求生服务器在线人数,《绝地求生:大逃杀》同时在线人数突破165万 官方就服务器问题向玩家致歉...
  5. 定了!《西安千古情》将于6月22日亮相浐灞!
  6. 广告效果聚类分析(KMeans)
  7. ajas php 验证码_thinkPHP3.2.3利用Ajax前台实现验证码验证,但通过form表单的按钮提交后,验证码一直错误!如何解决?...
  8. 体育Bank2016会议笔记
  9. Win10更新:你的设备中缺少重要的安全和质量修复。
  10. SFP DDM接口的测量值计算