`
seya
  • 浏览: 356160 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

在当前app的data目录下创建的文件

阅读更多
通常情况下我们可以把从网络上下载的数据存放在SD卡上,只要在AndroidManifest.xml中加入<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>的权限就可以了。这样写到SD卡上的文件也可以被其他应用程序访问。
但是有的时候,我们在没有SD卡的情况下也要保持应用正常工作,可以把文件存放在该应用的data目录下(/data/data/com.aaa.yourpackage/)。通过代码来实现:
File mediaFilesDir = mContext.getDir("mediaFiles", Context.MODE_WORLD_READABLE);
这样会在/data/data/com.aaa.yourpackage/目录下创建一个名为app_mediaFiles的目录,然后可以在这个目录下创建新的文件。这样创建出来的文件与在SD卡上创建出来的有一个很大的区别,就是权限。其他应用程序无法像加个permission来访问SD卡上的文件一样来访问我们在当前应用下创建的这个文件。那么怎么办呢。我们知道,android提供了一个SharedPreference,也是在自己的当前应用data目录下创建的一个xml文件,但是它是可以设置权限的,MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE. 这说明我们是可以去设置创建出来的文件的权限的,就需要去查看SharedPreference是如何实现对权限的设置的了。经过对源码的一番挖掘,发现原来在frameworks/base/core/java/android/app下面的ContextImpl中提供了这个方法来实现的:
private static void setFilePermissionsFromMode(String name, int mode,
            int extraPermissions) {
        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
            |FileUtils.S_IRGRP|FileUtils.S_IWGRP
            |extraPermissions;
        if ((mode&MODE_WORLD_READABLE) != 0) {
            perms |= FileUtils.S_IROTH;
        }
        if ((mode&MODE_WORLD_WRITEABLE) != 0) {
            perms |= FileUtils.S_IWOTH;
        }
        if (DEBUG) {
            Log.i(TAG, "File " + name + ": mode=0x" + Integer.toHexString(mode)
                  + ", perms=0x" + Integer.toHexString(perms));
        }
        FileUtils.setPermissions(name, perms, -1, -1);
    }


这里的参数表中的mode就是我们在获取SharedPreference时传过去的mode(MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE). 原来是用了FileUtils提供的静态方法 setPermissions()来设置的。这是一个native的方法,在对应的c++那边去实现了。
我们把setFilePermissionsFromMode稍微改造如下:
public static void setFilePermissionsFromMode(String name, int mode) {
        int perms = FileUtils.S_IRUSR|FileUtils.S_IWUSR
                        |FileUtils.S_IRGRP|FileUtils.S_IWGRP;
        if ((mode&Context.MODE_WORLD_READABLE) != 0) {
            perms |= FileUtils.S_IROTH;
        }
        if ((mode&Context.MODE_WORLD_WRITEABLE) != 0) {
            perms |= FileUtils.S_IWOTH;
        }
        FileUtils.setPermissions(name, perms, -1, -1);
}
这样就可以去设置文件的权限了。注意这里说的是设置,不是修改。也就是说只能在第一次创建这个文件的时候,就要把权限设置好。如果等文件创建好,再去设置权限,是无法实现的。这个和SharedPreference创建文件时的权限设置道理是一样的。如下代码:
FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file.getPath());
            //change file permission, so Message is able to access this file.
            MyUtil.setFilePermissionsFromMode(file.getPath(), Context.MODE_WORLD_READABLE);
           
            fos.write(bs);
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try
                {
                 
                    fos.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                    handleErrorMessage(e);
                }
            }
        }
如果我们把
MyUtil.setFilePermissionsFromMode(file.getPath(), Context.MODE_WORLD_READABLE);
放在fos.close()之后写,是无法设置该文件的权限的。
还有种更直接的方式,Context对象提供了openFileOutput(filename, mode); 作用于上文类似。
分享到:
评论

相关推荐

    rar压缩软件.rar

    在 Windows 中,这个文件应该放在 RAR 所在的或 %APPDATA%\WinRAR 目录中, 在 Unix 中- 放在用户的 home 目录或在 /etc 中。 提高压缩率和操作速度的提示: - 在压缩文件中,小文件应该被组织在一起; - 频繁被...

    NotesExporter:将 OS X 和 iOS Notes.app 笔记导出为纯文本文件

    在文件data/NotesV3.storedata寻找Notes.app SQLite3数据库,将一系列的note文件输出到当前工作目录下的notes目录中(多次备份会赋予整数后缀,如notes01 、 notes02等) . 在 OS X Yosemite 中,Notes.app 数据库...

    适合vs2015的番茄助手, 解决每次vs2015 vassistX 重启之后都要重新破解的解问题,

    破解方法:将破解包里的PiaoYun.dll和VA_X.dll复制到当前用户下的AppData\Local\Microsoft\VisualStudio\14.0\Extensions\es0tjwym.zme中,注意“es0tjwym.zme”这个名字是随机的,不同pc名称不一样,注意区分。...

    oracle恢复工具-FY_Recover_Data

    步骤1:先把Fy_Recover_Data包拷贝到oracle相关目录下 步骤2:在scott用户下创建test_emp表: SQL&gt; conn scott/tiger; Connected. SQL&gt; select * from tab; TNAME ? ? ? TABTYPE CLUSTERID --------------...

    SmartGit 19.1.1 Crack

    3.将-javaagent:C:\Users\%用户名%\AppData\Roaming\syntevo\SmartGit\crackSmartGit.jar=19.1.1添加至 用户目录下的smartgit.vmoptions文件中,如果没有此文件,自行创建一个 4.启动smartgit,选择Help-&gt;Register,...

    SmartGit19.1.3_Crack

    3.将-javaagent:C:\Users\%用户名%\AppData\Roaming\syntevo\SmartGit\crackSmartGit.jar=19.1.2添加至 用户目录下的smartgit.vmoptions文件中,如果没有此文件,自行创建一个 4.启动smartgit,选择Help-&gt;Register,...

    Oracle 主要配置文件介绍

    /u02/app/oracle/admin/cams/udump 6 UTL_FILE_DIR 参数 UTL_FILE_DIR = * UTL_FILE_DIR 参数指定一个或多个目录用于 Oracle 应用的文件 I/O 如备 份数据到文件 在 CAMS 系统中将该值设置为 * ...

    WinRAR_4.0.exe

    在 Windows 中,这个文件应该放在 RAR 所在的或 %APPDATA%\WinRAR 目录中, 在 Unix 中- 放在用户的 home 目录或在 /etc 中。 提高压缩率和操作速度的提示: - 在压缩文件中,小文件应该被组织在一起; - 频繁被...

    winiso6.3.0.5045中文注册版.rar

    软件介绍: 你只需要添加文件或文件夹就可以新建ISO/CUE/BIN/NRG/MDS/MDF/IMG...如果你的系统是WIN7,就复制到c:\Users\Administrator\AppData\Roaming\WinISO Computing\WinISO\目录下,同样覆盖原文件即是注册版。

    AppUpdate-一个简单、轻量、可随意定制 的Android版本更新库 .zip

    框架内部支持中/英文(其他语言只需要在对应的string.xml中取相同的名字即可)内部对话框背景图片、按钮支持自定义了查看版本中的Log只需要过滤AppUpdate开头的Tag重点: 如果没有设置downloadPath则默认为...

    ASP.NET的网页代码模型及生命周期

    创建一个单文件页模型,在【文件】按钮中选择【新建文件】选项,在弹出对话框中选择【Web窗体】或在右击当前项目,在下拉菜单中选择【添加新建项】选项即可创建一个.aspx页面,如图4-2所示。 图4-2 创建单文件页...

    WPF+EF+SQLite从建项目到写入数据开发环境配置

    设置数据库文件可复制到Debug目录(让程序在当前目录下找到数据库文件)=&gt; 制作User类=&gt; 制作DbContext文件=&gt; 里面有Word文档,工具软件,项目源码,VS2019请自行下载安装 使用一个按钮将数据写入数据库=&gt; 查看是否...

    MT+CTP程序化交易软件V2.4用MT4的EA做国内期货

    要通过快捷方式启动才能使行情数据与程序在相同的文件夹,否则MT4会自动在C:\Users\Administrator\AppData\Roaming\MetaQuotes下面创建数据文件夹,那就麻烦大了(MQL4,history等各种数据,包括子目录要移到数据文件夹)...

    minio对象存储服务

    mkdir data #在minio当前路径下面创建data文件夹 chmod +x ./minio #将minio设置为可执行文件 ./minio server ./data #启动minio 介绍: minio 兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java,...

    多玩前端工作流grunt-workflow.zip

    指定端口打开一个webserver,查看的文件是在开发目录下,支持livereload,sass自动编译,ejs编译 grunt release 生成发布文件,执行gunt release生成一个dest的目录,检测样式文件里的本地资源引用,如果有无效引用...

    winrar3.7 Beta8

    &lt;br&gt; 到处的设置文件 settings.reg 默认也被保存到 %APPDATA%\WinRAR 文件夹中, 但是 也可以在“保存 WinRAR 设置”和 “加载 WinRAR 设置” 对话框中选择其他的文件 夹。 &lt;br&gt; WinRAR 在它的 ...

    【yshop前后端分离商城系统 v3.2】拼团砍价秒杀+新增商品积分兑换模块+新增商城装修模块

    7、运行docker/applicatiion目录下 docker-compose,当然之前一定要打包jar包,构建镜像 切换到Dockerfile 文件下: docker build -t yshop-admin . 源码更新日志: 3.2版本已经正式发布啦! 1、新增商城装修模块 2、...

    KODExplorer 芒果云-资源管理器

    [如何使用] 下载程序,解压上传到你的服务器路径下,data目录设置777权限。访问体验超便捷的服务吧! (data目录没有写权限会导致配置修改不能保存、不能新建用户等) [关于上传问题] 程序没有做任何限制,如果需要...

    ASP&C#教程\精通Asp.net2.0+Sql2005项目开发

    \MyLibrary\App_Code\DataAccessHelper 图书管理数据访问接口层,包括文件: \SQLString.cs 构造SQL语句的通用类 \GetSafeData.cs 安全获取数据类 \MyLibrary\App_Code\DataAccessLayer 图书...

Global site tag (gtag.js) - Google Analytics