Файловый менеджер не имеет доступ к /sdcard!
Мой файловый менеджер не может получить доступ к /sdcard, хотя разрешение на то есть. И эта проблема наблюдается, когда мне надо из стороннего приложения выбрать файл (например, выбрать путь сохранения файла в MacroDroid). Файловый менеджер - "стоковый", изначальный, какой был в прошивке. Вот скриншот менеджера, когда я его просто открываю как отдельное приложение:

В случае с браузерами и соцсетями, они делают запрос не к всей /sdcard, а к "недавним", потому я смог прикрепить это фото сюда.
Я пробовал переустанавливать файловый менеджер, перепрошивал /system - ноль толку.
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 permissive.
Смотрю разрешения на папки - да вроде бы все нормально:
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 Editor. Добавил эти строки в 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: "default root URI is not valid root URI". Вопрос: как настроить этот ваш default root 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
Ответы (1 шт):
Заранее хочу сказать, что я не Andriod 9,10,11 программист, просто metal программист. Когда-то давно в детстве жёстко ломал KindleFire, тогда ещё какое-то время работал мастером по ремонту мобилок/ноутов...
Но всё же попытаюсь чуток дать ясность, глядишь и поможет.
Начнём с того что android.permission.STORAGE_INTERNAL вроде как без подписи промышленника тебе некто не даст. android.permission.WRITE_MEDIA_STORAGE это доступ только до медиа файлов, а именно - папки Фото, Видео, Аудио. (Чекни сам запись в папки Media)
В чём я могу быть не прав: Что вполне стоило-бы проверить - в Андроиде за /sdcard отвечает именно External Storage, а за папку реальной SD карты обычно отвечает Advanced External Storage...
Проверенный факт: То что ты ломаешь через Root Hack - это не более чем виртуальный драйвер. По факту ты говоришь драйверу что сделать надо вот это - драйвер это повторяет на железе.
Проверенный факт: Не стоит забывать что каждый разработчик телефонов в праве сам выбирать какой доступ к железу доступен, и вообще доступен-ли такой. Тот-же SL930A ни даёт ни кому доступа никуда, только ихний собственный софт. Там вообще жесткий хардкор, почти ни одно приложение нормально не работает.
А ещё меня сильно смущает лог, я его чуток разобрал... По сути Fatal...
05 15:22:55.243 12872 12872 E AndroidRuntime: FATAL EXCEPTION: main
05 15:22:55.243 12872 12872 E AndroidRuntime: Process: com.android.documentsui, PID: 12872
05 15:22:55.243 12872 12872 E AndroidRuntime: java.lang.RuntimeException: Default Root URI is not a valid root URI.
05 15:22:55.243 12872 12872 E AndroidRuntime: at com.android.documentsui.base.Shared.getDefaultRootUri(Shared.java:240)
05 15:22:55.243 12872 12872 E AndroidRuntime: at com.android.documentsui.AbstractActionHandler.loadHomeDir(AbstractActionHandler.java:551)
05 15:22:55.243 12872 12872 E AndroidRuntime: at com.android.documentsui.picker.ActionHandler.loadDefaultLocation(ActionHandler.java:228)
На Default Root URI is not a valid root URI. что опять-же типичные юзеры просто предлагают дать доступ именно к External Storage.
PS: Тоже факт: А почему такая путаница между Internal и External storage - так как первые версии ведра, вообще не предусматривали что у телефона будет своя память размером с космос. И было решено что /sdcard это реально SD Card. Что в конечном итоге вылилось в геморрой размером с космос. Скорее всего так и не исправили, чтобы была обратная совместимость с более старыми приложениями.
PSS: Ответ дал не за бонусы, а с надеждой что если вам это поможет, то вы полностью отпишите правильный ответ и это поможет многим программистам в решении похожих задач. Буду очень надеяться что мой ответ вам хоть чем-то помог.