Getting exception while opening PDF file for Andro

2020-04-17 06:01发布

I'm using Delphi 10.1 Berlin for developing Android mobile application and I need to open the PDF file from the application but I'm getting the error - android.os.FileUriExposedException: file:///Storage/emulated/0/Download/AppDataDetails/1.Pdf exposed beyond app through Intent.getData() and below I have mentioned the code:

AndroidManifest.template.xml:

<!-- **** ADD THIS SECTION **** -->
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.AatchiyarIAS.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
</provider>

provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-path name="external_files" path="."/>
</paths>

Delphi Code:

function TFrameFileDetail.GetMimeType(Uri: Jnet_Uri): JString;
var
  MimeType: JString;
  ContentResolver: JContentResolver;
  FileExtension: JString;
begin
  // https://stackoverflow.com/a/31691791/2899073

  MimeType := nil;
  if (Uri.getScheme.equals(TJContentResolver.JavaClass.SCHEME_CONTENT)) then
  begin
    ContentResolver := TAndroidHelper.Context.getContentResolver();
    MimeType := ContentResolver.getType(uri);
  end
  else
  begin
    FileExtension := TJMimeTypeMap.JavaClass.getFileExtensionFromUrl(uri.toString());

    MimeType := TJMimeTypeMap.JavaClass.getSingleton().getMimeTypeFromExtension(
      fileExtension.toLowerCase()
    );
  end;

  Result := MimeType;
end;


procedure TFrameFileDetail.OpenPDF(InpStrPDFPath: string);
var
  Data: Jnet_Uri;
  Intent: JIntent;
  javafile: JFile;
  &OriginalFile, PublicDirectoryFile, PublicFile: JFile;
  PublicDirectoryPath, PublicPath: string;
  Uri: Jnet_Uri;
begin
  PublicFile := TJFile.JavaClass.init(StringToJString(InpStrPDFPath));
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
  Uri := TJnet_Uri.JavaClass.fromFile(PublicFile);
  Intent.setDataAndType(Uri, self.GetMimeType(Uri));
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NO_HISTORY);
  TAndroidHelper.Activity.startActivity(Intent);
end;

Please help me to fix this issue.

1条回答
做自己的国王
2楼-- · 2020-04-17 06:43

You'll need this unit:

https://github.com/DelphiWorlds/KastriFree/blob/master/API/DW.Androidapi.JNI.FileProvider.pas

for this code:

uses
  Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;

procedure OpenPDF(const AFileName: string);
var
  LIntent: JIntent;
  LAuthority: JString;
  LUri: Jnet_Uri;
begin
  LAuthority := StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider');
  LUri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, LAuthority, TJFile.JavaClass.init(StringToJString(AFileName)));
  LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
  LIntent.setDataAndType(LUri, StringToJString('application/pdf'));
  LIntent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
  TAndroidHelper.Activity.startActivity(LIntent);
end;
查看更多
登录 后发表回答