android.os.FileUriExposedException : <filename> exposed beyond app through Intent. getData() 异常

标签 android delphi

在针对 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/

相关文章:

android - 通过whatsapp分享图片和文字

android - 防止服务在启动时启动

android - 我已从 list 中删除了通话和短信权限,但在上传 apk 时仍然出现错误

android - 在处理 Android 模式时 svgs 的 loadShape 失败

Delphi:设置为自动隐藏时如何显示托盘图标气球而不显示任务栏

Delphi - 为什么在Assign()过程中不复制事件?

delphi - Spring4D中是否可以多次注册同一个类/接口(interface)?

delphi - 是否可以在虚拟 TreeView 中选择多个列?

android - tabview 中的 webview 出现异常

delphi - Delphi DCU 文件保存在哪里?