在 android 应用程序的数据文件夹中读取和写入

Read and Write in data folder in android app

我创建了这个方法来读取文件:

@TargetApi(19)
public String getContentFile(String path) throws FileNotFoundException {

    BufferedReader br = new BufferedReader(new FileReader(path));

    try {
        Toast.makeText(MainActivity.this, "entrato", Toast.LENGTH_SHORT).show();
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
            line = br.readLine();
        }

        String everything = sb.toString();
        br.close();
        return everything;
    } catch (Exception e) {
        return "error";

    }

我在 MainActivity 中调用它,此代码适用于存储文件夹中的文件但不适用于 data/data 文件夹中的文件,我该如何更改它? Tha 应用程序适用于根设备,我的问题是:如何访问其他文件夹? 异常说:打开失败:EACCES(权限被拒绝) 所以我更改了文件权限并且它有效但是如何临时更改权限?

您的应用只有您自己目录的文件访问权限,即/data/data/your.package.name.

编辑:现在很明显,OP 正在尝试制作一个应用程序,该应用程序可以访问其自己的数据目录之外的文件 在有根设备 上。这使得这是一个完全不同的问题。据我所知,直接将应用程序 运行 作为 root 是不可能的。您可以做的是 运行 su 作为 shell 命令,然后是您需要 运行 作为 root 的任何 shell 命令。有几篇关于如何执行此操作的帖子,例如 ANDROID: How to gain root access in an Android application?

这意味着您可能必须使用 shell 命令而不是使用正常的 Android API:s 来执行所有根访问操作。但是,如果您需要做的只是访问您自己的数据目录之外的某个文件,也许您可​​以通过在根目录 shell 中使用 chownchmod 等来更改权限来完成此操作您尝试读取的文件的名称,以便您的应用程序的 UID 可以访问它(每个应用程序都会自动分配一个唯一的 uid,例如 "u0_a42")。然后您应该能够使用正常的 Java 文件操作访问它。

也许您甚至不需要实际将文件的所有者 user 更改为您的应用程序 UID,但可以使用一些现有的 group 你的应用程序已经属于,例如控制对 sd 卡的访问的那个(这是猜测)。您可能想尝试一下:

su
chown root:sdcard_r /data/path/to/file

只要您的应用程序拥有 android.permission.READ_EXTERNAL_STORAGE 我想您现在应该可以访问该文件了。您甚至可以使用未映射到任何权限的其他组。