Android之File操作权限

来源:互联网 发布:网络传销犯罪典型案例 编辑:程序博客网 时间:2024/05/29 19:39

一、File类

Java提供了一套完整的I/O流体系,包括FileInputStream、FileOutputStream等,Android中同样也有类似方法来访问手机存储器上的文件。

openFileOutput(String name)和openFileInput(String name, int mode)分别返回FileOutputStream类和FileInputStream类。由于操作简单,以下代码来自互联网:

private String read(){try{// 打开文件输入流FileInputStream fis = openFileInput(FILE_NAME);byte[] buff = new byte[1024];int hasRead = 0;StringBuilder sb = new StringBuilder("");// 读取文件内容while ((hasRead = fis.read(buff)) > 0){sb.append(new String(buff, 0, hasRead));}// 关闭文件输入流fis.close();return sb.toString();}catch (Exception e){e.printStackTrace();}return null;}private void write(String content){try{// 以追加模式打开文件输出流FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);// 将FileOutputStream包装成PrintStreamPrintStream ps = new PrintStream(fos);// 输出文件内容ps.println(content);// 关闭文件输出流ps.close();}catch (Exception e){e.printStackTrace();}}

二、读写SD卡文件

上述方法中,需要注意的有一点,FileInputStream fis = openFileInput(FILE_NAME);这句话中,FILE_NAME为文件名,其不包含该文件的路径,那么程序默认打开的都是应用程序的数据文件夹里的文件,很多时候,我们需要读写的是SD卡上的文件。android中,SD卡的默认路径是“/mnt/sdcard/”。

读写SD卡的步骤如下:

(1)调用Environment的getExternalStorageState()方法判断是否插入SD卡,以及是否具有SD卡读取权限。

(2)调用Environment的getExternalStorageDirectory()方法获取外部存储器,也就是SD卡的目录。

(3)调用FileInputStream、FileOutputStream、FileReader或FilderWriter读写SD卡的文件。

File file  = new File("/mnt/sdcard/");if(file.exists()) {    File[] currentFiles = file.listFile();    // WHAT YOU WANT TO DO }
还有一点不能忘记,那就是读写SD的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

(注意其在AndroidManifest.xml中的位置)

三、修改文件权限

终于说到重点啦。

用过Linux系统的童鞋一定对Linux系统的权限控制比较了解,Android的内核就是Linux,因此,Android系统中文件的权限也是一个很有趣的东西。

首先,要说明的就是通过adb shell来查看系统的文件(在Windows系统中无法看到Android系统的文件组织结构?)


这里说明两个目录:/data和/mnt。/data是我们的应用程序存储数据地方,比如在Eclipse中的File Exploer中看到的/data/data/PACKAGE_NAME/FILE_FOLDER(该路径为其绝对路径)。

在该shell中,由于其内核是Linux的,所以,把它当做Linux来用吧,ls,mkdir,cp……

还有一个问题需要重点说明,那就是在程序中修改文件的访问权限,先看下面的代码:

/* Check access permission */if (!device.canRead() || !device.canWrite()) {try {/* Missing read/write permission, trying to chmod the file */Process su;su = Runtime.getRuntime().exec("/system/bin/su");String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"+ "exit\n";su.getOutputStream().write(cmd.getBytes());if ((su.waitFor() != 0) || !device.canRead()|| !device.canWrite()) {throw new SecurityException();}} catch (Exception e) {e.printStackTrace();throw new SecurityException();}}
其中的device为File类的对象。注意,此操作是不提倡的,因为修改了文件的权限后,可能导致其他本来没有访问权限的应用访问甚至修改此文件,导致错误


留一个问题共探讨:在Android应用中,如果一个AppA需要访问另一个AppB的数据库文件(SQLite文件,路径为/data/data/AppB/databases/xxx.db),AppA的路径为/data/data/AppA,此时应该怎么办呢?能访问到吗?通过修改权限能实现吗?


0 0
原创粉丝点击