android.os.FileUriExposedException: <filename>暴露在应用程序外部,通过Intent.getData()方法。

3
在早期版本的Delphi(10.3 Rio之前),针对Android API < 24,可以像在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。我的答案如下(经过数小时的研究)。
1个回答

5
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;

1
对于权限而言,更通用的做法是使用:StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider')。 - Dave Nottage
感谢您提供的解决方案。 - grant1842
@grant1842 不用谢。感谢你的挑战。我也很想知道答案。 - Freddie Bell
我正在尝试这个解决方案。我在TJFileProvider上遇到了错误。这是我的使用情况:TJFileProvider Androidapi.JNI.JavaTypes,Androidapi.JNI.Os,Androidapi.JNI.Embarcadero,Androidapi.JNI.Provider,Androidapi.JNI.Net,Androidapi.JNI.Media,Androidapi.JNIBridge,FMX.ScrollBox;谢谢。 - grant1842
你缺少Androidapi.JNI.Support。我已经更新了我的答案,包括所有我使用的Androidapi。 - Freddie Bell
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接