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


    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;
    
    	}
    });
    

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

  • 相关阅读:
    [Python]机器学习:Tensorflow实现线性回归
    Python之Numpy:线性代数/矩阵运算
    特殊环境的安装教程[汇总]
    C/C++之编程语言学习资源
    Python之文件操作工具
    NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)
    网络分析:WireShark
    Linux/Window之定时任务脚本编写
    CSS之Background
    JavaScript之iframe页面间通信
  • 原文地址:https://www.cnblogs.com/zouqiang/p/10241378.html
Copyright © 2020-2023  润新知