HarmonyOS鸿蒙Next中团结引擎如何申请访问所有文件

HarmonyOS鸿蒙Next中团结引擎如何申请访问所有文件 最近有个unity游戏想要适配鸿蒙next,于是在团结引擎里面找到了编译open harmony的选项,且能正常导出deveco studio工程并编译。但是游戏资源文件比较大,我想要访问公用储存空间方便用户导入游戏资源包,没有找到unity的C#和鸿蒙的arkts对接并申请相关权限的方法,请问有没有人能分享一下?

7 回复

楼主可参考下面步骤:

1/ 在module.json5中声明存储权限:

"requestPermissions": [

  {

    "name": "ohos.permission.READ_MEDIA",

    "reason": "读取游戏资源包"

  },

  {

    "name": "ohos.permission.WRITE_MEDIA",

    "reason": "保存游戏资源包"

  }

]

2/ 创建权限申请模块:

import abilityAccessCtrl from '@kit.AbilityKit';

async function requestPermissions(context: common.Context): Promise<boolean> {

  const atManager = abilityAccessCtrl.createAtManager();

  try {

    await atManager.requestPermissionsFromUser(context, 

      ['ohos.permission.READ_MEDIA', 'ohos.permission.WRITE_MEDIA']);

    return true;

  } catch (err) {

    return false;

  }

}

3/ 实现文件路径获取接口:

import fs from '@kit.CoreFileKit';

function getPublicDir(): string {

  return `${fs.BaseDir.USER}/${getContext().bundleName}/files/GameResources`;

}

4/ 在C#中通过JSI调用原生接口:

#if UNITY_HARMONYOS

using HarmonyEngine.Runtime;

public class PermissionHelper : MonoBehaviour 

{

    [ExternalJSIFunction]

    public static bool RequestStoragePermission() 

    {

        return JSIHelper.CallStaticMethod<bool>("ohos.samples.PermissionUtils", 

            "requestPermissions");

    }

    

    [ExternalJSIFunction]

    public static string GetResourcePath() 

    {

        return JSIHelper.CallStaticMethod<string>("ohos.samples.PathUtils", 

            "getPublicDir");

    }

}

#endif

5/ 使用公共目录路径加载资源:

void LoadResourceBundle()

{

    string resourcePath = PermissionHelper.GetResourcePath();

    string bundlePath = Path.Combine(resourcePath, "level1.assetbundle");

    

    AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(bundlePath);

    request.completed += OnBundleLoaded;

}

更多关于HarmonyOS鸿蒙Next中团结引擎如何申请访问所有文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


1.Unity(C#) 侧只做游戏逻辑,不直接碰文件系统 2.在 DevEco 导出的 ArkTS 壳工程里统一申请公共目录权限,拿到文件路径后再把路径/二进制回传给 Unity 这是相关思路,望可以帮助你

你好,请问有什么办法可以在C#里面调用ArkTS定义的函数来获取文件路径吗?我在网上翻遍了也没找到C#调ArkTS的方法。

期待HarmonyOS能继续优化多屏协同功能,让跨设备体验更加完美。

只能通过插件一类的,

在HarmonyOS Next中,团结引擎申请访问所有文件需使用FilePicker模块。通过调用picker.select()方法并设置FileSelectOptionsselectTypeFILE,同时指定permissionGRANT_READ_URI_PERMISSION。在picker.select()回调中获取文件URI,通过fs.open()操作文件。需在module.json5中声明ohos.permission.READ_XXX权限。

在HarmonyOS Next中,团结引擎通过ArkTS与Unity C#的交互需使用Native API桥接。访问公共存储空间需申请ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA权限。具体步骤如下:

  1. module.json5中声明权限
{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA",
        "reason": "用于读取用户游戏资源"
      },
      {
        "name": "ohos.permission.WRITE_MEDIA",
        "reason": "用于写入游戏资源包"
      }
    ]
  }
}
  1. 通过ArkTS调用权限申请: 使用abilityAccessCtrlrequestPermissionsFromUser方法动态申请权限。

  2. C#与ArkTS交互

  • 在Unity C#中通过UnitySendMessage调用ArkTS侧方法
  • ArkTS侧通过Native API暴露文件操作接口(如使用@ohos.file.fs模块)
  • 通过回调机制将文件路径或数据传回Unity

示例ArkTS文件操作接口:

// 导出Native方法供C#调用
export default class FileManager {
  public static getExternalStoragePath(): string {
    return globalThis.abilityContext.filesDir + '/../';
  }
  
  public static readFile(uri: string): Uint8Array {
    const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
    const content = fs.readSync(file.fd);
    fs.closeSync(file);
    return content;
  }
}

需注意:首次权限申请需在ArkTS侧完成,Unity中可通过监听回调状态处理后续逻辑。

回到顶部