【问题标题】:Any change on file permissions between Android 4.4 (API19) and Android 7 (API24)?Android 4.4 (API 19) 和 Android 7 (API 24) 之间的文件权限有何变化?
【发布时间】:2017-12-01 13:43:45
【问题描述】:

我正在编写一个可以在 Android 4.4 上完美运行但无法在 Android 7 上运行的应用。 两台设备都已root。

我的应用程序的目的是从其他应用程序的数据目录(我们称之为 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);        
}

到此结束,一切正常:

我的文件目录具有权限:drwxrwxrwx,归 u0_a115 组 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 的手机上。

有人对我的方法有什么问题有一些提示,我错过了最新 API 的新内容吗?

谢谢。

【问题讨论】:

  • 是的,从 Android 6.0 及更高版本开始,读取和写入文件被视为危险权限,您需要为此征得用户的明确许可。要了解有关此结帐的更多信息,请点击此链接developer.android.com/guide/topics/permissions/…

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


【解决方案1】:

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

【讨论】:

  • 谢谢Ricardo,但操作不是在外部存储中进行的,而是在应用程序目录中进行的:/data/data/com.game.cheat/files
  • 找不到您的文件 - Android 中的权限被拒绝是明确的,您需要在 >=API 23 的运行时请求读/写权限。您不需要 chmod 或其他任何相关内容文件夹/文件权限
  • 所以你说XXXX_EXTERNAL_STORAGE也用于内部存储?这不是立即的。我会试一试的。
  • 很高兴为您提供帮助:)
猜你喜欢
  • 2014-08-08
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多