zoukankan      html  css  js  c++  java
  • Unity | 快速集成华为AGC云存储服务

    华为AppGallery Connect提供了一个云存储(CloudStorage)的服务,号称提供了一个便捷的云端存储服务,应用开发者使用的时候,可以不用关注服务器的部署,直接使用就行。

    目前这个功能还在bate阶段,我先抢先体验了一下。

    1、 环境与应用信息

    版本名称 集成环境 测试设备
    agconnect-storage:1.3.1.100 Unity 2019.4.17f1c1 荣耀magic2

    AGC地址:https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

    2、开通云存储服务

    PS: 云存储服务目前还处于beta状态,使用前应该发邮件去申请开通:
    https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-apply

    开通步骤也就是界面点击而已,此处就不详细介绍了,大家可以参考之前的文档
    https://developer.huawei.com/consumer/cn/forum/topic/0201411971207960391?fid=0101271690375130218

    3、导入Unity Package:

    官方文档:
    https://docs.unity.cn/cn/Packages-cn/com.unity.huaweiservice@1.3/manual/cloudstorage.html

    1、 下载Unity Hub,安装Unity
    https://unity.cn/releases。 下载安装就不详细介绍了。

    2、 Android环境配置:可参考如下截图

    在这里插入图片描述

    3、导入HuaweiServices的Package包:
    首先从链接下载package:
    https://share.unity.com/receive/?thread=237D-JA9D&packageCode=DzIiMvUpSO7GsT3dPV2M8qyBaw3R5bcbRhwD5RurQNM#keyCode=lkkIcH1nco7DIoL90AOReE0hwINGMsFP7mjwBAkg4_c

    (当前该包还未完全对外开放)

    下载到本地以后,在Unity中点击assets – Import package
    在这里插入图片描述

    然后,然后选择需要的包,点击Import即可

    4、AGC环境配置

    1、 配置华为AGC上的参数:回到AGC控制台:找到之前创建的App:

    https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

    2、选择:我的项目-> 构建 – 云存储 点击开通,开通云存储服务,需要配置默认的存储实例名称。(按需配置即可)

    为方便无需认证即可读写数据,安全策略配置为:

    agc.cloud.storage[
       match: /{bucket}/{path=**} {
          allow read, write:  if true;
       }
    ]
    

    3、 服务开通以后,回到项目设置界面,下载最新的json文件。

    在这里插入图片描述

    4、 将刚下载好json文件,放到Unity项目Assets / Plugins / Android目录下:

    注意,如果下载的json文件中,cloudstorage下没有default_storage参数,请手动添加:此处添加的值即为步骤三中配置的默认存储实例。

    在这里插入图片描述

    5、设置Unity中的Android环境:

    1、在Player-Publish Setting中启用Android的自定义清单和gradle

    在这里插入图片描述

    2、在Other Setting中配置包名:注意需要和AG官网的包名保持一致:

    在这里插入图片描述

    3、配置项目级gradle,此处对应AssetsPluginsAndroid路径下的baseProjectTmeplate.gradle文件,添加如下内容

        allprojects {
            buildscript {
                repositories {
                    maven { url 'https://developer.huawei.com/repo/' }
                }
            }
            dependencies {
                classpath 'com.android.tools.build:gradle:3.4.0'
                classpath 'com.huawei.agconnect:agcp:1.4.2.301'
                **BUILD_SCRIPT_DEPS**
            }
        }
            repositories {
                maven { url 'https://developer.huawei.com/repo/' }
            }
        }
    
    1. 配置应用级gradle,此处对应AssetsPluginsAndroid路径下的LauncherTmeplate.gradle文件,添加如下内容:
    apply plugin: 'com.android.application'
    apply plugin: 'com.huawei.agconnect'
     
    dependencies {
    implementation project(':unityLibrary')
    implementation "com.huawei.agconnect:agconnect-storage:1.3.1.100"
    implementation 'com.huawei.agconnect:agconnect-auth:1.4.2.301'
    
    1. 配置Manifest文件:申请读写权限,用于读写文件
    <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     
        <application
            android:allowBackup="false"
            android:requestLegacyExternalStorage="true" >
    

    6、从零开发云存储功能

    1、界面布局:

    依次点击GameObject- UI –Button, 创建一个按钮。 点击选中按钮,然后在右侧选择 Add Component, 创建并且添加一个Script文件。在文件中创建对应的方法

    在这里插入图片描述

    2、初始化云存储实例、并且申请读写权限。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using HuaweiService;
    using HuaweiService.CloudStorage;
    using System;
     
    public delegate void SuccessCallBack<T>(T o);
    public class HmsSuccessListener<T>:OnSuccessListener{
        public SuccessCallBack<T> CallBack;
        public HmsSuccessListener(SuccessCallBack<T> c){
            CallBack = c;
        }
        public void onSuccess(T arg0)
        {
            Debug.Log("OnSuccessListener onSuccess");
            if(CallBack != null)
            {
                CallBack.Invoke(arg0);
            }
        }
            
        public override void onSuccess(AndroidJavaObject arg0){
            Debug.Log("OnSuccessListener onSuccess");
            if(CallBack !=null)
            {
                Type type = typeof(T);
                IHmsBase ret = (IHmsBase)Activator.CreateInstance(type);
                ret.obj = arg0;
                CallBack.Invoke((T)ret);
            }
        }
    }
     
    public class testStorageDemo : MonoBehaviour
    {
        private AGCStorageManagement mAGCStorageManagement;
        private string[] permissions =
            {
                "android.permission.WRITE_EXTERNAL_STORAGE",
                "android.permission.READ_EXTERNAL_STORAGE",
            };
        // Start is called before the first frame update
        void Start()
        {
            AndroidJavaClass javaUnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = javaUnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            Activity aaa = HmsUtil.GetHmsBase<Activity>(currentActivity);
            ActivityCompat.requestPermissions(aaa, permissions, 1);
        }
     
        // Update is called once per frame
        void Update()
        {
            
        }
        
        public void initAGCStorageManagement() {
     
            mAGCStorageManagement = AGCStorageManagement.getInstance("9105385871708601205-ffeon");
            Debug.Log("Instance is: "+ mAGCStorageManagement);
     
        }
        
        public class MySuccessListener : OnSuccessListener
            {
                private string m_name;
     
                public MySuccessListener(string name)
                {
                    m_name = name;
                }
     
                public MySuccessListener()
                {
                    m_name = "default";
                }
     
                public override void onSuccess(AndroidJavaObject ex)
                {
                    Debug.Log("download success: " + m_name);
                }
            }
     
    }
    

    3、上传文件:

         public void uploadFile() {
            if (mAGCStorageManagement == null){
                initAGCStorageManagement();
            }
            string fileName = "testUnity.jpg";
            StorageReference reference = mAGCStorageManagement.getStorageReference(fileName);
            string FileFolder = "/storage/emulated/0/AGCSdk/";
            string FilePath = FileFolder + fileName;
     
            Debug.Log("FilePath = " + FilePath);
            File file = new File(FilePath);
            Debug.Log("UploadFile = " + file);
     
            UploadTask task = reference.putFile(file);
            task.addOnSuccessListener(new MySuccessListener());
            Debug.Log("UploadFile done:");
        }
    

    4、下载文件

    public void downloadFile() {
            if (mAGCStorageManagement == null){
                initAGCStorageManagement();
            }
            StorageReference reference = mAGCStorageManagement.getStorageReference("test.jpg");
            string FileFolder = "/storage/emulated/0/AGCSdk/";
            string FilePath = FileFolder + "test.jpg";
     
            Debug.Log("FilePath = " + FilePath);
            File file = new File(FilePath);
            Debug.Log("File = " + file);
     
            DownloadTask task = reference.getFile(file);
            task.addOnSuccessListener(new MySuccessListener("NormalListener"));
            Debug.Log("DownloadTask Result:");
        }
    

    5、删除文件

    public void deleteFile() {
            if (mAGCStorageManagement == null){
                initAGCStorageManagement();
            }
            
            StorageReference reference = mAGCStorageManagement.getStorageReference("testUnity.jpg");
            reference.delete();
            Debug.Log("DeleteFileTest success.");
        }
    

    6、打包测试

    打包的安装好以后,点击每个按钮的同时,可以在Android Logcat中,筛选Unity关键字,查看Debug.Log输出的相关日志。

    上传和下载时,同步关注agc界面上文件的变化

    7、总结

    仅关注前端应用的开发,就可以利用AGC云存储服务在unity上开发一个带云端存储服务功能的游戏,不用为了服务器的搭建和运维担心,省时省力。而且云存储服务还提供了类似于管理员模式的web控制台,可以简单直观的对服务器上的文件进行管理。

    这个云存储服务,除了最普通的上传下载和删除功能,还包括有设置元数据等功能,具体可以看官方文档:

    欲了解更多详情,请参见:

    云存储服务开发指南:

    https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-introduction

    Unity关于云存储的文档:

    https://docs.unity.cn/cn/Packages-cn/com.unity.huaweiservice@1.3/manual/cloudstorage.html

    云存储服务codelab:

    https://github.com/AppGalleryConnect/agc-android-demos/tree/master/agc-cloudstorage-demo-java


    原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0201454878602100779?fid=0101271690375130218

    原作者:Mayism

  • 相关阅读:
    Selenium2用最简xpath查找元素
    如何锁定Android系统CPU的频率
    github FATAL:unable to access 'https://github.com/...: Failed to connect to github.com:443; No error
    解压.tar.gz出错gzip: stdin: not in gzip format tar: /Child returned status 1 tar: Error is not recoverable: exiting now
    Shell脚本完成hadoop的集群安装
    Linux压缩与归档
    selenium2-元素管理方式及解析
    selenium2-框架思想介绍
    11.AutoMapper 之值转换器(Value Transformers)
    10.AutoMapper 之自定义值解析器(Custom Value Resolvers)
  • 原文地址:https://www.cnblogs.com/developer-huawei/p/14541641.html
Copyright © 2011-2022 走看看