3

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 Answer 1

6

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;
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.