[Delphi] Androidの外部ストレージへ読み書き

(開発言語)
  Embarcadero Delphi 10.4 (with Android SDK)
(動作確認)
  Nexus7 (Android 6)
  → 正常に処理される
  SH-M06 (Android 10)
  → "I/Oエラー 13"が表示される
     "AndroidManifest.xml"のandroid:resizeableActivity="false">の前に
     下記の1行を追加すれば正常に処理される
     android:requestLegacyExternalStorage="true"


//======================================================================
//  機能:[ファイル作成]のボタン処理
//======================================================================
procedure TfmMain.btFileSaveClick(Sender: TObject);
const
    perm_tbl: array[1..2] of string = (
        'android.permission.WRITE_EXTERNAL_STORAGE',
        'android.permission.READ_EXTERNAL_STORAGE'
    );
begin
    //外部ストレージへの読み書きのPermissionを得る
    // (usesに'System.Permissions'が必要)
    PermissionsService.RequestPermissions(
        [ perm_tbl[1]{, perm_tbl[2]} ],
        procedure(  const APermissions: TArray;
                    const AGrantResults: TArray )
        begin
            if PermissionsService.IsPermissionGranted(perm_tbl[1]) and
               PermissionsService.IsPermissionGranted(perm_tbl[2]) then
                FileWriteProc()
            else
                ShowMessage( '外部ストレージへの読み書きの権限が有りません' );
        end
    );
end;


//======================================================================
//  機能:ファイルを作成する
//      (usesに'System.IOUtils'が必要)
//======================================================================
procedure TfmMain.FileWriteProc;
var
        fname, msg: string;
        fpW: TextFile;
begin
    fname := System.IOUtils.TPath.Combine(
//           System.IOUtils.TPath.GetPublicPath,
// GetShared○○Pathに保存するには'WRITE_EXTERNAL_STORAGE'の権限が必要
             System.IOUtils.TPath.GetSharedDocumentsPath,
//           System.IOUtils.TPath.GetSharedDownloadsPath,
//           System.IOUtils.TPath.GetSharedPicturesPath,
             'デバッグ.txt' );
    msg := '下記の場所にファイルを作成します' + sLineBreak+
            ExtractFilePath(fname);
    TDialogService.MessageDialog(
        msg,
        TMsgDlgType.mtConfirmation, // ダイアログのタイプ
        mbYesNo,                    // 表示するボタンの集合
        TMsgDlgBtn.mbYes,           // デフォルトフォーカスボタン
        0,                          // HelpContext
        procedure(const AResult: TModalResult) // 応答を受け取るハンドラー
        begin
            if AResult=mrYes then begin
                try
                    AssignFile( fpW,fname );    Rewrite( fpW );
                    Writeln( fpW, FormatDateTime('yyyy/mm/dd, hh:mm',Now) );
                    CloseFile( fpW );
                    ShowMessage( ExtractFileName(fname)+'を保存しました' );
                except
                    on E: Exception do begin
                        msg := E.ClassName + sLineBreak + E.Message;
                        ShowMessage( msg );
                    end;
                end;
            end;
        end
    );
end;


      

・インターネット上の情報を参考に作成してます。
・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。
・記述内容に問題点や改善点がありましたらこちらまでお願いします。

サンプル集の一覧に戻る