(開発言語)
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;
|