Unity录屏实现(三)
继续填上次的坑,,本文只是转载,偶尔看见一博客说 5.1有录屏api,好吧,还是看代码吧:
Android代码:
package cn.net.xuefei.unityrec;
import java.io.File;
import java.io.IOException;
import com.unity3d.player.UnityPlayerActivity;
import android.Manifest;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.DisplayMetrics;
import android.widget.Toast;public class MainActivity extends UnityPlayerActivity {private static final int RECORD_REQUEST_CODE = 101;private static final int STORAGE_REQUEST_CODE = 102;private static final int AUDIO_REQUEST_CODE = 103;private static final int SHOW = 1;private static final int CANCEL = 2;private boolean isRecording;public static Context currentActivity;private MediaProjectionManager mediaProjectionManager;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case SHOW:if (isRecording) {Toast.makeText(MainActivity.this, "录制已开始", Toast.LENGTH_SHORT).show();} else {startScreenCapture();isRecording = true;}break;case CANCEL:if (isRecording) {mediaRecorder.stop();mediaRecorder.reset();mediaProjection.stop();virtualDisplay.release();isRecording = false;insertVideoToMediaStore(getSaveDirectory() + videoName);Toast.makeText(MainActivity.this, "录制结束", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "没有开始录制", Toast.LENGTH_SHORT).show();}break;}}};private MediaProjection mediaProjection;private MediaRecorder mediaRecorder;private VirtualDisplay virtualDisplay;/*** 屏幕的宽度*/private int screenWidth;/*** 屏幕的高度*/private int screenHeight;/*** 屏幕的像素*/private int screenDpi;private DisplayMetrics metrics;/*** 保存在相册视频的名字*/private String videoName;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mediaRecorder = new MediaRecorder();metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);/*** 动态注册权限*/if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },STORAGE_REQUEST_CODE);}if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.RECORD_AUDIO },AUDIO_REQUEST_CODE);}currentActivity = this;//mUnityPlayer.requestFocus();}/*** unity调用的方法,需要用一个handler进行处理实现功能,直接无法实现。*/public void stopRecordin() {mHandler.sendEmptyMessage(CANCEL);}/*** unity调用的方法,需要用一个handler进行处理实现功能,直接无法实现。*/public void startRecording() {mHandler.sendEmptyMessage(SHOW);}private void startScreenCapture() {mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);Intent captureIntent = mediaProjectionManager.createScreenCaptureIntent();startActivityForResult(captureIntent, RECORD_REQUEST_CODE);}public void setConfig(int screenWidth, int screenHeight, int screenDpi) {this.screenWidth = screenWidth;this.screenHeight = screenHeight;this.screenDpi = screenDpi;}protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == RECORD_REQUEST_CODE && resultCode == RESULT_OK) {mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);setConfig(metrics.widthPixels, metrics.heightPixels, metrics.densityDpi);startRecord();Toast.makeText(this, "开始录制", Toast.LENGTH_SHORT).show();}}public boolean startRecord() {initRecorder();createVirtualDisplay();mediaRecorder.start();return true;}private void createVirtualDisplay() {virtualDisplay = mediaProjection.createVirtualDisplay("MainScreen", screenWidth, screenHeight, screenDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mediaRecorder.getSurface(), null, null);}private void initRecorder() {mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);videoName = System.currentTimeMillis() + ".mp4";mediaRecorder.setOutputFile(getSaveDirectory() + videoName);mediaRecorder.setVideoSize(screenWidth, screenHeight);mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);mediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024);mediaRecorder.setVideoFrameRate(30);try {mediaRecorder.prepare();} catch (IOException e) {e.printStackTrace();}}public String getSaveDirectory() {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String screenRecordPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator+ "DCIM" + File.separator + "Camera" + File.separator;return screenRecordPath;} else {return null;}}public void insertVideoToMediaStore(String filePath) {ContentValues values = new ContentValues();values.put(MediaStore.MediaColumns.DATA, filePath);// video/*values.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);}/*** 打开相册,** @return*/public void openAlbum() {Intent intent = new Intent(Intent.ACTION_PICK);startActivity(intent);}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="cn.net.xuefei.unityrec"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="22"android:targetSdkVersion="22" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><!--往sdcard中写入数据的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!--在sdcard中创建/删除文件的权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><application><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
Unity代码:
using UnityEngine;
using System.Collections;public class UnityRec : MonoBehaviour
{ // Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){}void OnGUI(){if (GUI.Button(new Rect(0, 0, 300, 300), "开始录屏")){
#if UNITY_ANDROIDAndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("startRecording");
#elif UNITY_IPHONE#endif}if (GUI.Button(new Rect(0, 300, 300, 300), "停止录屏")){
# if UNITY_ANDROIDAndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("stopRecordin");
#elif UNITY_IPHONE#endif}}
}
我只是在Android 6.0的机器上测试了一下,其他版本,布吉岛哇……
哦,差点忘了,原文地址 http://blog.csdn.net/keepmovingwzc/article/details/53635643
Unity录屏实现(三)相关推荐
- Unity录屏功能插件NatCorder使用简记
Unity录屏功能插件NatCorder使用简记 简单介绍 插件下载 使用简介 代码 参考链接 简单介绍 NatCorder 是一个轻量级且易于使用的全功能视频录制 API,适用于 iOS.Andro ...
- Unity 录屏截屏到Android相册,支持鸿蒙
Unity截屏保存到Android相册 Unity端截屏代码 Unity需要的Android Jar及Java代码(由于之前是找的一个Jar库因不支持鸿蒙所以自己动手二次开发的Java调用库) Uni ...
- Unity录屏实现(一)
几天前下载到一个安卓工程,可以把图片合成视频,突然想开坑做一个Unity录屏功能,然后就开始了. Android代码: package cn.net.xuefei.unityrec;import st ...
- android 屏幕录制方案,Android录屏的三种解决方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
- Unity录屏插件Recorder
Unity Recorder是一个编辑器中的录制工具(仅能用于编辑器中),可以在运行模式下将Unity场景及动画.Timeline录制成动画或视频. 相对于直接录屏有这么几点好处: 可以自定义输出分辨 ...
- Unity录屏的坑(FFmpeg)
一.FFmpeg 安装与Setup Screen Capturer Recorder v0.12.10安装 下载地址:链接:https://pan.baidu.com/s/1cIKyKMa6nhymV ...
- android 屏幕录制方案,Android录屏的三种方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
- android 盒子录屏apk,三种用于安卓录屏的解决方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
- Android音频录制方案,Android录屏的三种方案
本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...
最新文章
- 监听指定端口数据交互(HttpListenerContext )
- php针对中文的字符串函数,php截取中文字符串函数实例_php技巧
- Android 取得 ListView中每一个Item项目的值
- c语言倒置存放,c语言倒置
- [libuv] libuv学习
- Tomcat Post请求参数长度限制
- kubespray容器化部署kubernetes高可用集群
- 50个常用sql语句 网上流行的学生选课表的例子
- android 导航自动切换,Android导航抽屉切换图标向右
- PHP基础--PDO的常用操作
- Mac多功能文件搜索软件:HoudahSpot
- SQL不能以实例名连接问题处理
- 线性代数————思维导图(上岸必备)(矩阵部分)
- import cv2
- 中国储运杂志中国储运杂志社中国储运编辑部2022年第7期目录
- word文档在线编辑推荐超级文档
- 【Fiddle】The Fiddler AutoResponder is enabled, but this request did not match any of the listed rules
- 搜索引擎常用搜索技巧
- 如何用纯 CSS 创作一盘传统蚊香 1
- Bark – 给自己的 iPhone 发推送提醒,简单开源且免费
热门文章
- 【编译器】斯坦福公开课学习2
- 全新蓝海项目,自媒体行业收益天花板,轻松月入5000+
- 番茄助手Visual Assist X提示中文注释错误
- 【渝粤题库】国家开放大学2021春2394内科护理学题目
- 探探、觅伊、soul如果不充值,那在社交平台交友有多难?
- Heartbeat的可靠消息通信实现分析
- pci内存控制器_内存超频与主板有什么关联呢?
- 微信小程序之错误问题:net::ERR_PROXY_CONNECTION_FAILED
- 激光甲烷传感器功能简述
- VoxEdit 主题创作大赛:将 90 年代的复古元素带入 Web3