[英]Delphi FireMonkey TListBox AddObject exception on Android
[英]Getting exception while opening PDF file for Android 26 using Firemonkey/Delphi
我正在使用 Delphi 10.1 Berlin 開發 Android 移動應用程序,我需要從應用程序打開 PDF 文件,但出現錯誤 - android.os.FileUriExposedException: file:///Storage/emulated/0/Download/ AppDataDetails/1.Pdf 通過 Intent.getData() 暴露在應用程序之外,下面我提到了代碼:
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>
德爾福代碼:
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;
請幫我解決這個問題。
你需要這個單元:
https://github.com/DelphiWorlds/KastriFree/blob/master/API/DW.Androidapi.JNI.FileProvider.pas
對於此代碼:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.