Android 4.4 (API 19) 和 Android 7 (API 24) 之间的文件权限有任何变化吗?
Any change on file permissions between Android 4.4 (API19) and Android 7 (API24)?
我正在编写一个在 Android 4.4 上完美运行但在 Android 7 上运行失败的应用程序。
2台设备已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 的 owner/group 匹配)
我复制的文件具有相同的 owner/group 和权限:-rwxrwxrwx
现在尝试打开复制的文件进行阅读时:
InputStream input = context.openFileInput( fileName );
openFileInput 抛出异常:
java.io.FileNotFoundException: /data/user/0/com.game.cheat/files/savedgame.dat (Permission denied)
这只发生在 phone 上 Android 7.0 API24.
任何人都对我的方法有什么问题有一些提示,我是否错过了最新 API 的新内容?
谢谢。
直到 API 23 清单中的权限足以让您访问设备的外部存储以及其他类型的权限。来自API23 一些权限必须在运行时由用户授予,例如写入外部存储的权限。
这里有一个例子:
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);
}
我正在编写一个在 Android 4.4 上完美运行但在 Android 7 上运行失败的应用程序。 2台设备已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 的 owner/group 匹配) 我复制的文件具有相同的 owner/group 和权限:-rwxrwxrwx
现在尝试打开复制的文件进行阅读时:
InputStream input = context.openFileInput( fileName );
openFileInput 抛出异常:
java.io.FileNotFoundException: /data/user/0/com.game.cheat/files/savedgame.dat (Permission denied)
这只发生在 phone 上 Android 7.0 API24.
任何人都对我的方法有什么问题有一些提示,我是否错过了最新 API 的新内容?
谢谢。
直到 API 23 清单中的权限足以让您访问设备的外部存储以及其他类型的权限。来自API23 一些权限必须在运行时由用户授予,例如写入外部存储的权限。
这里有一个例子:
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);
}