在针对 Android API < 24 的早期版本的 Delphi(10.3 Rio 之前)中,可以创建文件 Intent ,如问题 opening the image with the external gallery using delphi 的答案中所示。
但是,现在 10.3 以 Android API >= 24 为目标,该代码产生了这个问题的主题错误。
我努力在 Delphi Use android fileprovider to send intent to open and image file with the default android gallery 回答了这个问题但是这个问题作为重复问题被关闭了,即使答案更接近,是在 Android Java 而不是 Delphi 中。我的答案如下(经过几个小时的研究后得出)
最佳答案
uses
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.Media,
Androidapi.Helpers,
Androidapi.JNI.Net,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.App,
Androidapi.JNI.Os,
Androidapi.JNI.Support,
System.IOUtils;
procedure TTabbedForm.Button1Click(Sender: TObject);
var
Intent: JIntent;
FileName, DestFileName: string;
Data: Jnet_Uri;
CompName: JComponentName;
lFile: JFile;
const
IMAGE_FILENAME = 'small_what.jpg';
begin
FileName := System.IOUtils.TPath.GetPublicPath + PathDelim + IMAGE_FILENAME; // deployed to "assets"
DestFileName := TPath.GetDownloadsPath + PathDelim + IMAGE_FILENAME;
TFile.Copy(FileName, DestFileName, true);
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
if TJBuild_VERSION.JavaClass.SDK_INT >= TJBuild_VERSION_CODES.JavaClass.N then
begin
lFile := TJFile.JavaClass.init(StringToJString(FileName));
Intent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
Data := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context,
StringToJString('com.embarcadero.TestIntents.fileprovider'), lFile);
end
else
Data := TJnet_Uri.JavaClass.parse(StringToJString('file://' + DestFileName));
Intent.setDataAndType(Data, StringToJString('image/jpg'));
try
TAndroidHelper.Activity.startActivity(Intent);
except
on E: Exception do
begin
Label1.Text := E.Message;
end;
end;
关于android.os.FileUriExposedException : <filename> exposed beyond app through Intent. getData() 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54535225/