我的文件管理器无法访问 /sdcard,即使它有权这样做。当我需要从第三方应用程序中选择文件时(例如,选择将文件保存在 MacroDroid 中的路径),就会出现此问题。文件管理器是“库存”,原始的,在固件中。这是我将其作为独立应用程序打开时的管理器屏幕截图:
在浏览器和社交网络的情况下,它们不会向整个 /sdcard 发出请求,而是向“最近”发出请求,所以我能够在此处附上这张照片。
我尝试重新安装文件管理器,闪烁/系统 - 无济于事。
我附上了logcat:https ://pastebin.com/74Jtv06B (它只插入一行,因此我把它扔进pastebin,至少可以读取)(我删除了MiXplorer,但问题仍然存在)
UPD:我决定通过 Termux 来“调查”这个问题。发现这个:
# Обратите внимание, что я
# использую строго Termux user,
# в т ч без использования global
# mount namespace
termux@termux: ~ $ mount | grep "/data/media" | column -t | grep "rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb"
/data/media on /mnt/runtime/default/emulated type sdcardfs (rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb)
/data/media on /data/local/nhsystem/kali-arm64/sdcard type sdcardfs (rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb)
/data/media on /storage/emulated type sdcardfs (rw,nosuid,nodev,noexec,noatime,fsuid=1023,fsgid=1023,gid=1015,multiuser,mask=6,derive_gid,default_normal,unshared_obb)
termux@termux: ~ $ ls /sdcard -l
/sdcard -> /storage/self/primary
termux@termux: ~ $ ls /storage/self/primary -l
/storage/self/primary -> /storage/emulated/0
termux@termux: ~ $ ls /storage/emulated/0
...
termux@termux: ~ $ ls /data/local/nhsystem/kali-arm64/sdcard
...
termux@termux: ~ $ ls /mnt/runtime/default/emulated/0
ls: Permission denied
据我了解,在默认路径上,我无法访问 sdcard,但为什么?SELinux 允许的。
我查看了文件夹的权限——是的,一切似乎都很好:
termux@termux: ~ $ /sbin/su
root@android: ~ # ls /storage/emulated -l
drwxrwx--x 35 root sdcard_rw 4096 2022-08-10 15:48 0
root@android: ~ # ls /data/local/nhsystem/kali-arm64 -l
...
drwxrwx--x 35 root sdcard_rw 4096 2022-08-10 15:48 sdcard
...
root@android: ~ # ls /mnt/runtime/default/emulated -l
drwxrwx--x 35 root sdcard_rw 4096 2022-08-10 15:48 0
root@android: ~ # getenforce
Permissive
UPD2:Android 10、Lineage OS 17.1
UPD3:我通过 APK 编辑器重建了默认管理器的 apk(因为仍然通过它进行内存请求)。我将这些行添加到 Manifest.xml(它们最初不存在,我pm grant
写道那里没有提供此类权限):
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.STORAGE_INTERNAL" />
设置中没有出现任何内容,但现在pm grant
它给出了无法更改此分辨率的错误:
root@android: ~ # pm grant com.android.documentsui android.permission.WRITE_MEDIA_STORAGE
Security exception: Permission android.permission.WRITE_MEDIA_STORAGE requested by com.android.documentsui is not a changeable permission type
java.lang.SecurityException: Permission android.permission.WRITE_MEDIA_STORAGE requested by com.android.documentsui is not a changeable permission type
at com.android.server.pm.permission.BasePermission.enforceDeclaredUsedAndRuntimeOrDevelopment(BasePermission.java:448)
at com.android.server.pm.permission.PermissionManagerService.grantRuntimePermission(PermissionManagerService.java:2181)
at com.android.server.pm.permission.PermissionManagerService.access$1000(PermissionManagerService.java:122)
at com.android.server.pm.permission.PermissionManagerService$PermissionManagerServiceInternalImpl.grantRuntimePermission(PermissionManagerService.java:3167)
at com.android.server.pm.PackageManagerService.grantRuntimePermission(PackageManagerService.java:5846)
at com.android.server.pm.PackageManagerShellCommand.runGrantRevokePermission(PackageManagerShellCommand.java:1955)
at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:230)
at android.os.ShellCommand.exec(ShellCommand.java:104)
at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:22020)
at android.os.Binder.shellCommand(Binder.java:881)
at android.os.Binder.onTransact(Binder.java:765)
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4876)
at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:4110)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
我尝试重新安装 - 无济于事
root@android: / # mount -o remount /mnt/runtime/default/emulated
Error: /mnt/runtime/default/emulated not in /proc/mounts
restorecon
不起作用:
root@android: /mnt/runtime/default # restorecon -F -R default
SELinux: Loaded file_contexts
SELinux: Could not set context for /mnt/runtime/default/emulated: Operation not supported on transport endpoint
restorecon: restorecon failed: default
UPD:logcat 中的错误:“默认根 URI 不是有效的根 URI”。问题:如何设置您的默认根 URI
UPD:我的默认文件管理器根本没有权限,但系统将其添加到 sdcard_rw 组,正如它所说/data/system/packages.list
root@termux: ~ # cat /data/system/packages.list | grep com.android.documentsui
com.android.documentsui 10074 0 /data/user/0/com.android.documentsui platform:privapp:targetSdkVersion=28 1028,1015,1023 0 29
提前声明,我不是Andriod 9,10,11程序员,只是个金属程序员。曾几何时,我还是个孩子的时候,我很努力地弄坏了 KindleFire,然后我做了一段时间的手机/笔记本电脑维修工......
但我仍然会尽量澄清一点,你看,它会有所帮助。
让我们从一个事实开始,
android.permission.STORAGE_INTERNAL
如果没有实业家的签名,似乎有人不会给你。android.permission.WRITE_MEDIA_STORAGE
这只能访问媒体文件,即文件夹照片、视频、音频。(检查媒体文件夹中的录音本身)我可能错了:值得检查 - 在 Android
/sdcard
中,负责的是外部存储,而高级外部存储通常负责真正 SD 卡的文件夹......事实证明:你突破 Root Hack 的只不过是一个虚拟驱动程序。事实上,你告诉驱动程序做什么是这样的——驱动程序在硬件上重复这个。
经证实的事实:不要忘记,每个手机开发人员都有权选择对硬件的访问权限,以及这种访问权限是否可用。同样的 SL930A 不会让任何人在任何地方访问,只有他们自己的软件。一般有硬核,几乎没有应用程序正常工作。
而且我也被日志弄得很糊涂,整理了一下……其实Fatal……
Default Root URI is not a valid root URI.
同样,典型用户只是提供对外部存储的访问权限。PS:还有一个事实:为什么内部存储和外部存储之间存在这种混淆 - 因为存储桶的第一个版本根本没有提供手机将拥有自己的空间大小的内存。并且决定 /sdcard 真的是一张 SD 卡。这最终导致了痔疮大小的空间。最有可能的是,他们从未修复它,以便与旧应用程序向后兼容。
PSS:我给出的答案不是为了奖金,而是希望如果它对您有所帮助,那么您将完全取消订阅正确的答案,这将有助于许多程序员解决类似的问题。我真的希望我的回答对您有所帮助。