Android 4.4(API19)和Android 7(API24)之间的文件权限有何变化?

时间:2017-06-28 09:13:31

标签: android file-permissions android-context android-7.0-nougat rooted-device

我正在编写一款适用于Android 4.4的应用,但无法在Android 7上运行。 2台设备已植根。

我的应用程序的目的是从其他应用程序的数据目录中获取文件(让我们称之为com.game.orig),将它们复制到我的应用程序目录(让我们称之为com.game.cheat)并阅读他们,在将它们写回原始目录之前修改它们。

所以使用“su”(抛出那里找到的函数ExecuteAsRootBase.java) 我将文件从com.game.orig复制到com.game.cheat目录,如下所示:

PackageManager m = context.getPackageManager();
String appDir = getPackageDirectory("com.game.orig",m);// /data/user/0/com.game.orig/files/

String localDir = getPackageDirectory(context.getPackageName(),m);// /data/user/0/com.game.cheat/files/

if (ExecuteAsRootBase.canRunRootCommands()) {
    ExecuteAsRootBase rootBase = new ExecuteAsRootBase();
    Sting fileName="savedgame.dat";
    int uid=context.getApplicationInfo().uid;//get the uid (owner) of my app.

    //Create localDir (files subdirectory) if not exists
    File directory = new File(localDir);
    if (!directory.exists()) {
        directory.mkdirs();
        //adjust file permission (not sure it's realy needed)
        rootBase.executecmd("chmod 777 "+ localDir);
        rootBase.executecmd("chown " + uid + "." + uid + " " + localDir);
    }
   //copy file from appDir to localdir using 'su'
   rootBase.execute("cp "+ appDir +fileName + " " + localDir)){
   //adjust file permission
   rootBase.execute("chmod 777 "+ localDir +fileName);
   rootBase.execute("chown " + uid + "." + uid + " " + localDir + fileName);        
}

在此结束,一切正常:

我的文件目录包含perms:drwxrwxrwx并由u0_a115,group u0_a115拥有。 (与/data/data/com.game.cheat的所有者/组匹配) 和我复制的文件具有相同的所有者/组和烫发:-rwxrwxrwx

现在尝试打开复制的文件来阅读它:

InputStream input = context.openFileInput( fileName );

openFileInput抛出异常:

java.io.FileNotFoundException: /data/user/0/com.game.cheat/files/savedgame.dat (Permission denied)

这仅在使用Android 7.0 API24的手机上出现。

任何人都有一些关于我的approch有什么问题的提示,我错过了最新API的新内容?

感谢。

1 个答案:

答案 0 :(得分:2)

在API 23之前,清单中的权限足以让您以其他类型的权限访问设备的外部存储。从API 23开始,用户必须在运行时授予某些权限,例如在外部存储中写入的权限。

以下是您可以执行此操作的示例:

private boolean checkWriteExternalPermission() {

    String permission_read = Manifest.permission.READ_EXTERNAL_STORAGE;
    String permission_write = Manifest.permission.WRITE_EXTERNAL_STORAGE;
    int res = this.checkCallingOrSelfPermission(permission_read);
    int res2 = this.checkCallingOrSelfPermission(permission_write);
    return (res == PackageManager.PERMISSION_GRANTED && res2 == PackageManager.PERMISSION_GRANTED);
}

现在您只需要将此方法应用于您的方法,例如:

if(checkWriteExternalPermission()){
    //do your logic with file writing/reading
} else{
    //ask for user permissions
    ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}