Android系统第三方应用无法读写外置TF卡
车载设备会挂载TF卡进行视频录像的存储,第三方app需要在TF卡目录下进行修改、创建、删除文件等操作,但是外置TF卡第三方应用没有读写权限。
- 需求实现
AndroidManifest.xml添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
尝试在TF卡创建文件夹
try {
File folder = new File("/storage/5611-15D4/newfolder");
if (!folder.exists()) {
folder.mkdir();
}
} catch (Exception e) {
e.printStackTrace();
}
报错
E/File: err java.io.IOException: Permission denied
- 解决方案
在Android中有些权限只能有系统签名的app才能申请,第三方app不能申请。如果要开放某个权限给第三方,我们只能修改系统源码。android.permission.WRITE_MEDIA_STORAGE 是SD卡写权限,只有系统签名的app才可以申请,第三方app如果要写SD卡 只能用 SAF。
此处实现把 android.permission.WRITE_MEDIA_STORAGE 开放给第三方应用,验证Android7系统可以完成写入。
diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
index 59f7c11..825e76e 100755
--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -10151,7 +10151,7 @@ public class PackageManagerService extends IPackageManager.Stub {
case PermissionInfo.PROTECTION_SIGNATURE: {
// For all apps signature permissions are install time ones.
allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);
- if (allowedSig) {
+ if (allowedSig || perm.equals("android.permission.WRITE_MEDIA_STORAGE")) {//或者if(true),或者if (allowedSig || pkg.packageName.equals(package_name))
grant = GRANT_INSTALL;
}
} break;