`
seya
  • 浏览: 362302 次
  • 性别: 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); 作用于上文类似。
分享到:
评论

相关推荐

    uni-app实现视频文件指定目录下载并重命名

    【uni-app实现视频文件指定目录下载并重命名】 在移动应用开发中,有时我们需要实现一个功能,让用户能够从网络上下载视频文件,并将其保存到特定的本地目录,同时允许用户自定义文件名。uni-app是一个基于Vue.js的...

    OUTLOOK打开附件提示无法创建文件解决方案.docx

    - 使用资源管理器访问当前OutlookSecureTempFolder指向的路径,如:`C:\Users\username\AppData\Local\Microsoft\Windows\TemporaryInternetFiles\Content.Outlook\KY2K8Y1J\`。 - 清空该文件夹中的所有内容,尤其...

    Oracel之创建控制文件.pdf

    例如,假设Trace文件位于`d:\app\administrator\diag\rdbms\orcl\orcl\trace`目录下,那么可以在该目录下找到相应的Trace文件,并使用文本编辑器打开查看其中的创建控制文件脚本。 4. **数据库必须处于NOMOUNT状态...

    Qt实现文件拷贝

    为了跟踪进度和管理错误,你可以创建一个类来保存当前的拷贝状态,如已复制的文件数量、总文件数等。同时,为可能出现的错误(如权限问题、文件正在使用等)提供适当的异常处理。 以下是一个简单的代码框架,展示了...

    用LogWriter将Android应用程序的日志信息写入文件

    通常,我们会在外部存储(外部SD卡或内部存储的公共目录)的特定子目录下创建日志文件,以避免污染用户的数据。文件名可以包含时间戳,以便区分不同时间段的日志。例如: ```java String logDir = Environment....

    获取临时文件目录的位置

    在Windows系统中,临时文件通常存放在`%SystemRoot%\Temp`或`%USERPROFILE%\AppData\Local\Temp`目录下,其中`%SystemRoot%`代表Windows安装目录,如C:\Windows,`%USERPROFILE%`则是当前用户的个人文件夹。...

    RAC中创建spfile

    7. 然后,删除现有的spfile文件,并确保在dbs目录下不再保留旧的spfile文件。这一步骤很重要,以防止启动时出现路径查找错误。 8. 一旦完成这些步骤,就可以利用`srvctl`工具(服务控制工具)来管理Oracle RAC服务...

    用jQuery Mobile创建Web App

    在当前的互联网环境中,Web App已经成为移动设备上不可或缺的应用形式。jQuery Mobile,作为一款强大的前端框架,为开发者提供了简单、高效的手段来创建响应式、触摸友好的Web App。本文将深入探讨如何利用jQuery ...

    ios 选择其他应用打开文件

    7. App Store审核:在发布应用时,必须确保在App Store Connect的Info.plist文件中正确地声明了支持的文件类型,否则App Store可能会拒绝你的应用。 8. 用户隐私:在处理用户文件时,必须尊重用户隐私,遵循苹果的...

    ecmall文件目录结构

    2. **app**: 此目录下的文件主要用于后台管理和卖家中心,提供了如订单管理、商品管理、用户管理等操作的逻辑代码。 3. **includes**: 这个目录存储了所有后台管理和应用程序的库文件,包括数据库连接、函数库、...

    rar压缩软件.rar

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

    Android App Widget 开发

    首先,创建一个新的Android项目,并在`res/xml`目录下创建一个名为`app_widget_info.xml`的配置文件。这个文件定义了App Widget的基本属性,如最小宽度和高度、初始数量等。例如: ```xml &lt;appwidget-provider ...

    android 桌面控件appwidget

    1. **创建AppWidget布局**:在res/layout目录下创建XML布局文件,定义你的AppWidget的外观。例如,你可以创建一个包含两个TextView的布局,用于显示时间和日期。 2. **创建AppWidget提供者**:在项目的Java代码中...

    c#使用资源文件实现多语言

    `App_Data`目录通常用来存放数据库连接文件或其他非编译的结构化数据,但在实现多语言功能时,它可能不直接相关。 `51aspx源码必读.txt`和`最新Asp.Net源码下载.url`可能是学习资料或链接,它们与实现多语言的具体...

    精彩编程与编程技巧-在运行时修改DataEnvironment的连接字符串...

    在这个例子中,使用的是Microsoft Jet数据库引擎(OLE DB 3.51版本),并且指定了数据库文件的路径为当前应用程序目录下的`Data\MyDB.mdb`。 3. **设置连接字符串**:将构建好的连接字符串赋值给`DataEnvironment1....

    Set读入access数据库程序(VB6.0源代码编写)strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\text.mdb;Persist Security Info=False"

    `App.Path`是VB6.0中的一个属性,返回应用程序当前目录,这里表示数据库文件位于应用的同一目录下,文件名为`text.mdb`。 - `Persist Security Info=False`:安全设置,表明不存储任何敏感的凭据信息。 2. **ADO...

    uni-app全局变量的几种实现方式.zip

    本压缩包文件"uni-app全局变量的几种实现方式.zip"可能包含了关于如何在uni-app中设置和使用全局变量的各种方法。以下是对这些实现方式的详细说明: 1. **Vue的data属性**: 在uni-app中,每个页面都是一个Vue组件...

    用Matlab制作的GUI界面,用于文件读取处理和显示

    在本文中,我们将深入探讨如何使用Matlab创建GUI(图形用户界面)以及它在文件读取、处理和数据显示中的应用。Matlab GUI是一种交互式的工具,允许用户通过可视化控件与程序进行交互,使得数据分析和处理变得更加...

    删除SVN, VS 的临时文件命令

    VS在编译、调试和运行项目时,会在项目目录、用户的AppData目录以及临时目录下创建各种临时文件。例如,`.suo`文件存储了用户特定的设置,`obj`和`bin`目录包含了编译后的中间文件和可执行文件。如果你想在发布程序...

Global site tag (gtag.js) - Google Analytics