当前位置: 首页 > 知识库问答 >
问题:

Android.os.FileUriExposedException:通过Intent.GetData()在应用程序之外公开

鲍向笛
2023-03-14

在以Android API<24为目标的Delphi早期版本(10.3 Rio之前)中,可以创建文件意图,如使用Delphi使用外部图库打开图像的问题答案所示

但是,既然10.3的目标是Android API>=24,那么这段代码就会产生这个问题的主题。

我试图在Delphi使用android fileprovider向默认的android gallery发送打开和图像文件的意图来回答这个问题,但是这个问题被作为一个重复关闭了,尽管更接近的答案是在android Java中,而不是在Delphi中。我的答案如下(经过几个小时的研究之后)

共有1个答案

章岳
2023-03-14
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;
 类似资料:
  • 问题陈述 我正在尝试创建VCardfile,它已经成功创建,但是,我想共享创建的文件

  • 所以我希望有人能帮我解决这个问题:) 谢谢

  • 我已经从服务器下载了apk文件,现在正在安装,但它给了我一个错误:通过Intent暴露在应用程序之外。getData() 我的代码是 我已经搜索了错误,找到了一些但无法解决的问题。建议使用FileProvider。我这样做只是为了查看日志 可能会有帮助。 请提供帮助和建议。

  • 问题内容: 当前,我有一个Java Standalone Swing应用程序。 现在,当用户单击Swing应用程序中的按钮时,我想启动另一个Java应用程序(说:Calculator.jar) 我可以知道什么是便携式方法吗?这样它就可以在多个OS中工作吗? 问题答案: 使用或只是将其放在类路径中并调用其。

  • 当我尝试更新应用程序时,应用程序崩溃了。在我们的应用程序中,我们正在缓存中保存更新的版本,然后尝试从缓存中安装应用程序。应用程序由于android.os.fileuriexposedexception而崩溃。我发现通过intent.getData()在应用程序之外公开了日志android.os.fileuriexposedexception:file:///storage/emulated/0/t

  • 问题内容: app.py test.py 我正在将 应用程序 导入到 test.py中 以进行单元测试。在将’ before_request ‘函数调用到test.py中时,它会抛出RuntimeError:在应用程序上下文之外工作同样会在调用’ input_info() ‘时发生 问题答案: Flask有一个Application Context ,似乎您需要执行以下操作: 您可能还可以将调用推