vložil Radek Červinka
24. ledna 2024 19:30
S příchodem Androidu 11 google zpřísnil přístup k souborům, které nejsou přímo vaše, ale jsou sdílené (třeba na SD kartě atd). Do verze Android 12 to šlo potlačit přes manifest a requestLegacyExternalStorage, ale s příchodem Androidu 13 se situace změnila.
Google tlačí nový způsob práce se soubory, kterému se teď nebudu věnovat, ale pokud chcete používat původní přístup, lze vynutit jeho použítí. Jedná se o právo MANAGE_APP_ALL_FILES_ACCESS_PERMISSION . Tuto možnost lze zapnout jak z nastavení Androidu (je to trochu schované, ale třeba na videu s nastavením je to celkem pochopitelné pokud o tom něco tušíte).
Samozřejmě to lze vyvolat i z kódu a pro publikování ve Store je to nutnost (kód byl dříve převzat z knihovny Kastri, na kterou jsem již několikrát odkazoval a autorem je Dave Nottage)
class function TMainForm.NeedsAllFilesAccessPermission: Boolean;
begin
{$IFDEF WIN32}
Result := False;
{$ELSE}
Result := TOSVersion.Check(11) and not TJEnvironment.JavaClass.isExternalStorageManager;
{$ENDIF}
end;
class function TMainForm.ShowAllFilesAccessPermissionSettings: Boolean;
{$IFDEF ANDROID}
var
LIntent: JIntent;
LUri: Jnet_Uri;
LAction: JString;
begin
Result := False;
if NeedsAllFilesAccessPermission then
begin
LUri := TJnet_Uri.JavaClass.fromParts(StringToJString('package'), TAndroidHelper.Context.getPackageName, nil);
LAction := StringToJString('android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION');
LIntent := TJIntent.JavaClass.init(LAction, LUri);
TAndroidHelper.Context.startActivity(LIntent);
Result := True;
end;
{$ELSE}
begin
{$ENDIF}
end;
Po nastavení v manifestu (resp. v options projektu) ALL_FILES_ACCESS_PERMISSION a zavoláním ShowAllFilesAccessPermissionSettings na vhodném místě by se měl dát používat přístup k souborům jako ve starších verzí.
Sranda je, že pokud máte Android 12 a v něm nainstalovanou aplikaci, tak google při aktualizaci na Android 13 tiše povolí tuto možnost a vše funguje jako dříve. Ale čistá instalace nefunguje a vy se nechápete, proč to jinde na Android 13 funguje.