继续填上次的坑,,本文只是转载,偶尔看见一博客说 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录屏实现(三)相关推荐

  1. Unity录屏功能插件NatCorder使用简记

    Unity录屏功能插件NatCorder使用简记 简单介绍 插件下载 使用简介 代码 参考链接 简单介绍 NatCorder 是一个轻量级且易于使用的全功能视频录制 API,适用于 iOS.Andro ...

  2. Unity 录屏截屏到Android相册,支持鸿蒙

    Unity截屏保存到Android相册 Unity端截屏代码 Unity需要的Android Jar及Java代码(由于之前是找的一个Jar库因不支持鸿蒙所以自己动手二次开发的Java调用库) Uni ...

  3. Unity录屏实现(一)

    几天前下载到一个安卓工程,可以把图片合成视频,突然想开坑做一个Unity录屏功能,然后就开始了. Android代码: package cn.net.xuefei.unityrec;import st ...

  4. android 屏幕录制方案,Android录屏的三种解决方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  5. Unity录屏插件Recorder

    Unity Recorder是一个编辑器中的录制工具(仅能用于编辑器中),可以在运行模式下将Unity场景及动画.Timeline录制成动画或视频. 相对于直接录屏有这么几点好处: 可以自定义输出分辨 ...

  6. Unity录屏的坑(FFmpeg)

    一.FFmpeg 安装与Setup Screen Capturer Recorder v0.12.10安装 下载地址:链接:https://pan.baidu.com/s/1cIKyKMa6nhymV ...

  7. android 屏幕录制方案,Android录屏的三种方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  8. android 盒子录屏apk,三种用于安卓录屏的解决方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

  9. Android音频录制方案,Android录屏的三种方案

    本文总结三种用于安卓录屏的解决方案: adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCod ...

最新文章

  1. 监听指定端口数据交互(HttpListenerContext )
  2. php针对中文的字符串函数,php截取中文字符串函数实例_php技巧
  3. Android 取得 ListView中每一个Item项目的值
  4. c语言倒置存放,c语言倒置
  5. [libuv] libuv学习
  6. Tomcat Post请求参数长度限制
  7. kubespray容器化部署kubernetes高可用集群
  8. 50个常用sql语句 网上流行的学生选课表的例子
  9. android 导航自动切换,Android导航抽屉切换图标向右
  10. PHP基础--PDO的常用操作
  11. Mac多功能文件搜索软件:HoudahSpot
  12. SQL不能以实例名连接问题处理
  13. 线性代数————思维导图(上岸必备)(矩阵部分)
  14. import cv2
  15. 中国储运杂志中国储运杂志社中国储运编辑部2022年第7期目录
  16. word文档在线编辑推荐超级文档
  17. 【Fiddle】The Fiddler AutoResponder is enabled, but this request did not match any of the listed rules
  18. 搜索引擎常用搜索技巧
  19. 如何用纯 CSS 创作一盘传统蚊香 1
  20. Bark – 给自己的 iPhone 发推送提醒,简单开源且免费

热门文章

  1. 【编译器】斯坦福公开课学习2
  2. 全新蓝海项目,自媒体行业收益天花板,轻松月入5000+
  3. 番茄助手Visual Assist X提示中文注释错误
  4. 【渝粤题库】国家开放大学2021春2394内科护理学题目
  5. 探探、觅伊、soul如果不充值,那在社交平台交友有多难?
  6. Heartbeat的可靠消息通信实现分析
  7. pci内存控制器_内存超频与主板有什么关联呢?
  8. 微信小程序之错误问题:net::ERR_PROXY_CONNECTION_FAILED
  9. 激光甲烷传感器功能简述
  10. VoxEdit 主题创作大赛:将 90 年代的复古元素带入 Web3