当前位置: 首页 > article >正文

Android GameActivity(NativeActivity)读写文件

        最近研究native android相关内容,其中最棘手的就是文件读写问题,最主要的是相关的文档很少。这里写下我所知道的方法。

        由于本人使用的是Android14[arm64-v8a]版本的设备,能访问的路径相当有限,如果想要访问更多的路径,就不得不申请权限了。可用的路径如下:

1. assets:/assets
2. internalDataPath: /data/user/0/com.example.org/files
3. externalDataPath:/storage/emulated/0/Android/data/com.example.org/files
4. obbPath:/storage/emulated/0/Android/obb/com.example.org
5. Document:/storage/emulated/0/Document
6. Download:/storage/emulated/0/Download
一、Apk中的assets目录

        以下列android工程为例,将资源文件放置在assets目录下,android studio打包时会将文件打包到apk中。   

     

std::vector<char> ReadFromAssets(const char *path,android_app* app) {
    if(app==nullptr) return {};
    AAsset* file = AAssetManager_open(app->activity->assetManager,
    path,AASSET_MODE_BUFFER);
    if(file==nullptr) return {};
    size_t len = AAsset_getLength(file);
    std::vector<char> data;
    data.resize(len);
    AAsset_read(file, data.data(), len);
    AAsset_close(file);
    return data;
}

example:
dir:assets/image/x.png
data = ReadFromAssets("image/x.png",app);
二、其他目录

        2~6路径作为根目录,在对应路径下创建或访问子文件或路径是可以的,用下列方法访问完整路径即可。遗憾的是,仅当app执行一次mkdir(filePath.c_str(), 0774)后,app才能正常读取创建的目录下的文件。当清楚app全部数据后,将会失去目录的读写权限,只有删除目录并让app重新创建才能使用。

#include <filesystem>
#include <sys/stat.h>
std::vector<char> ReadFileFromPath(const char* path) {
    std::filesystem::path absolutePath(path);
    auto filePath =  absolutePath.parent_path();
    struct stat sb{};
    int32_t res = stat(filePath.c_str(), &sb);
    if (0 == res && sb.st_mode & S_IFDIR)
    {
        //has dir
    }
    else if (ENOENT == errno)
    {
        //not has dir,create  dir
        res = mkdir(filePath.c_str(), 0774);
    }
    if(0!=res) return {};

    std::ifstream file;
    file.open(path, std::ifstream::in);
    if(!file.is_open()){
        return {};
    }
    file.seekg(0,std::ifstream ::end);
    auto len = file.tellg();
    std::vector<char> data;
    if(len>0){
        file.seekg(0,std::ifstream ::beg);
        data.resize(len);
        file.read(data.data(),static_cast<int>(len));
    }
    file.close();
    return data;
}


example:
ReadFileFromPath("/storage/emulated/0/Android/data/com.example.org/files/data/123.obb");


http://www.kler.cn/a/464938.html

相关文章:

  • 深度评测uni-app x:开启跨平台开发新篇章
  • STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显
  • linux 程序开发调试常用命令汇总持续更新
  • JAVA: 状态模式(State Pattern)的技术指南
  • Jenkins 中自动化部署 Spring Boot 项目
  • 前端路由layout布局处理以及菜单交互(三)
  • 【docker】Dockerfile 中使用宿主机代理的方式
  • php ,利用纯真IP数据库,获取IP
  • 数据结构与算法之动态规划: LeetCode 1143. 最长公共子序列 (Ts版)
  • 【递归、搜索与回溯】二叉树的深搜
  • 欧科云链研究院:ChatGPT 眼中的 Web3
  • 深入研究.NET 中的 CLR
  • 存储对象之【视图】
  • [网络安全] DVWA之Content Security Policy (CSP) Bypass 攻击姿势及解题详析合集
  • Golang 如何打包到Docker运行
  • 小程序组件 —— 25 组件案例 - 商品导航区域
  • df.replace({‘b‘: r‘\s*\.\s*‘}, {‘b‘: np.nan}, regex=True)
  • (六)vForm 动态表单(数据量大,下拉选卡顿问题)
  • C# 服务调用RFC函数获取物料信息,并输出生成Excel文件
  • 【商业化】【微软商店】微软打包时报找不到img/logo.ico