代码之家  ›  专栏  ›  技术社区  ›  lolonapoli

安卓4.4(API19)和安卓7(API24)之间的文件权限有任何变化吗?

  •  0
  • lolonapoli  · 技术社区  · 7 年前

    这两个设备是根设备。

    所以使用“su”(抛出在那里找到的函数 ExecuteAsRootBase.java 我从com.game复制文件。原版到com.game。欺骗目录如下:

    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:-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的手机上发生。

    有人对我的方法中的错误有什么提示吗?我错过了最新API的新功能吗?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ricardo    7 年前

    在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);
    }