首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

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

2012-09-01 
在当前app的data目录下创建的文件通常情况下我们可以把从网络上下载的数据存放在SD卡上,只要在AndroidMani

在当前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); 作用于上文类似。

热点排行