Unity项目接入应用宝SDK实现截图功能


问题由来

  • 点击应用宝悬浮窗

  • 如图所示 左下角有一个截图按钮

需要解决那些问题

  • 截图信息需要由游戏引擎提供

  • SDK获取截图信息为同步 但是Unity引擎没有提供同步接口

  • 如何防止测试同学和智障不停的点击截图按钮

点击截图按钮程序流程

  • SDK调用caputureImage方法获取截图信息

  • 在caputureImage方法中通知Unity截图

  • 在caputureImage方法中等待截图信息

  • Unity截图完成后发送给安卓层

  • 返回数据给SDK

  • 实现一个缓存5秒截图信息功能

unity代码

  • 安卓层通知Unity截图接口
public void CaputureImage()
{
StartCoroutine(Caputure());
}
  • Unity获取截图信息返回给安卓层
IEnumerator Caputure()
{
//等待当前帧渲染完成
yield return new WaitForEndOfFrame(); // 先创建一个的空纹理,大小可根据实现需要来设置
Texture2D screenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); // 读取屏幕像素信息并存储为纹理数据,
screenShot.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
screenShot.Apply(); // 然后将这些纹理数据,成一个png图片文件
byte[] bytes = screenShot.EncodeToPNG(); //把数据返回给安卓层
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("SendScreenshotData", bytes);
}
}

Android代码

  • 定义Bitmap变量
  • 定义Timer定时
Bitmap bitmap = null;
Timer timer = null;
  • 接受Unity发送过来的截图信息并转换为Bitmap类型
public void SendScreenshotData(byte[] bytes)
{
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
  • SDK截图回调
// 游戏助手内截屏分享功能
YSDKApi.setScreenCapturer(new IScreenImageCapturer() {
@Override
public Bitmap caputureImage() { //如果没有缓存则通知Unity截图
if (bitmap == null) { UnityPlayer.UnitySendMessage("Directional Light", "CaputureImage", "");
} //强行延迟等待截图数据
while (bitmap == null) { try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //开始一个5秒定时器
if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() {
@Override
public void run() { //删除缓存和定时器
bitmap = null; timer = null;
}
}, 5000);
} return bitmap; }
});

如果你有更好的思路和解决方法,也请多多指教

Unity项目接入应用宝SDK实现截图功能的更多相关文章

  1. 接入淘宝SDK(OneSDK)和支付宝SDK(AlipaySDK)出现 duplicate symbols for architecture i386

    起初我在我的项目中先接入了AlipaySDK,没有出现什么问题,之后想要接入淘宝SDK之后,就出现了duplicate symbols for architecture i386的错误 经过一段时间排 ...

  2. Unity 下集成第三方原生 SDK,以极光厂商通道为例

    Unity中集成三方SDK有两种方式: Unity 项目开发中时常有集成 Android 第三方 SDK 的需求,比如接入第三方推送,分享等功能.而第三方 SDK 的集成文档提到的往往是基于原生 An ...

  3. unity工程接入Android sdk后真机测试解锁屏后退出的解决

    unity工程接入如91.移动支付等Android sdk后,真机运行尤其是在4.0+以上坏境,往往会出现解锁屏后退出的情况,解决办法如下: 可以在AndroidManifest.xml中所有的con ...

  4. Unity快速接入SDK框架

    先把工程源码贴出来: 链接:http://pan.baidu.com/s/1geDhtS3 密码:i0s9 最近接android ios的SDK 已经接了10多个 有点心得 分享一下 如果有更好想法求 ...

  5. 《转》iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑

    最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...

  6. 教你高速高效接入SDK——Unity统一接入渠道SDK(Android篇)

    U8SDK的设计之初,就是为了可以支持各种游戏引擎开发的游戏,而不不过Android的原生平台.眼下一大半的手游,都是採用Unity3D和Cocos2dx开发,那么这里,我们就先来一步步给大家演示,用 ...

  7. Unity接入多个SDK的通用接口开发与资源管理(三)

    接着上篇,介绍SDK资源的导入.首先介绍一下Android Studio工程. AS工程可以由多个Module组成,我们可以把某个Module作为我们打包的Module,其他的Module当做资源导入 ...

  8. Unity接入多个SDK的通用接口开发与资源管理(二)

    接着上篇,本篇对SDK接口进行封装.在开始之前,需要先了解下面知识. (1)unity与android之间的交互 unity通过下面方式调用android中的函数: 方法一: AndroidJavaC ...

  9. Unity接入多个SDK的通用接口开发与资源管理(一)

    每一款游戏都有接入多个SDK的需求.当接入多个SDK时会面临两个问题: (1)代码层面:每个SDK都有调用各自功能的方法,我们需要统一管理每个SDK提供的方法,这样会使每个SDK调用方便,使代码整洁易 ...

随机推荐

  1. openstack之安全组管理

    命令概览 (nova-api)[root@cc07 /]# nova help|grep secgroup add-secgroup Add a Security Group to a server. ...

  2. 关于CSS的优先级,CSS优先级计算,多个class引用

    原则一: 继承不如指定 原则二: #id > .class > 标签选择符 原则三:越具体越强大 原则四:标签#id >#id ; 标签.class > .class CSS优 ...

  3. 学以致用十-----centos7.2+python3.6+vim8.1+YouCompleteMe

    趟过了之前的坑后,再来安装YouCompleteMe 一.安装依赖包 yum install libXt-devel gtk2-devel yum -y install python-devel ru ...

  4. Edifact 95B报文解读

    PART 1 INTRODUCTION D100_D.95B PART 2 UNIFORM RULES OF CONDUCT FOR INTERCHANGE PART2_D.ZIP(1) OF TRA ...

  5. 实现两个sym转一个sym

    CVO输出如果是一个像素并行输出,选择内嵌人插入同步码.如果两个像素并行输出是不能选择内嵌的,只能选择分离的方式.如果把输出的并行数据给VIP并且要求是内嵌,那只能在内部转或者外部转. 这里是实现外部 ...

  6. [转]MySQL源码:Range和Ref优化的成本评估

    MySQL源码:Range和Ref优化的成本评估 原文链接:http://www.orczhou.com/index.php/2012/12/mysql-source-code-optimizer-r ...

  7. .net 打开Excel文档并转为DataTable

    /// <summary> /// 打开Excel文档并转为DataTable /// </summary> /// <returns></returns&g ...

  8. AngularJS中$interval和$timeout的使用

    我们在项目中会出现定时刷新,延迟加载等多种场景. 接下来就看$interval和$timeout的使用 $interval可用于定时任务,我们只需在controller注入$interval即可使用. ...

  9. Linux远程批量工具mooon_ssh和mooon_upload使用示例

    目录 目录 1 1. 前言 1 2. 批量执行命令工具:mooon_ssh 2 3. 批量上传文件工具:mooon_upload 2 4. 使用示例 3 4.1. 使用示例1:上传/etc/hosts ...

  10. common.php

    <?php /** * */ class Common { if(!function_exists('is_php')) { function is_php($version = '5.0.0' ...