Android 7.0強制啟用了被稱作 StrictMode的策略,帶來的影響就是你的App對外無法暴露file://
類型的URI了。
如果你使用Intent攜帶這樣的URI去打開外部App(比如:打開系統相機拍照),那么會拋出FileUriExposedException異常。
Delphi 為Android項目提供了Secure File Sharing選擇項,默認是False。這一項是設置什么呢?
原來,Android 7及以后的版本,為了加強OS的安全性,不允許一個app訪問其他app的文件,為了解決這個問題,將Secure File Sharing設置為True
完整代碼如下:
unit Unit1;interfaceusesSystem.SysUtils, System.Types, System.UITypes, System.Classes,System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics,FMX.Dialogs, FMX.Controls.Presentation,{$IFDEF ANDROID}Androidapi.JNI.Support, Androidapi.JNI.GraphicsContentViewText,Androidapi.JNI.Net, Androidapi.JNI.Os, Androidapi.JNI.JavaTypes,Androidapi.Helpers,{$ENDIF}FMX.StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.fmx}procedure TForm1.Button1Click(Sender: TObject);
varaUrl: string;{$IFDEF ANDROID}Intent: JIntent;Data: Jnet_Uri;{$ENDIF}
beginvar path: string := '/sdcard/test.jpg';if FileExists(path) thenbegin{$IFDEF ANDROID}Intent := TJIntent.Create;Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);if TJBuild_VERSION.JavaClass.SDK_INT >= TJBuild_VERSION_CODES.JavaClass.N thenbeginvar lFile: JFile := TJFile.JavaClass.init(StringToJString(path));Intent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);Data := TJcontent_FileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, StringToJString('com.junwei.JWMeeting.fileprovider'), lFile); //將這個com.junwei.JWMeeting 換成您的程序包endelseData := TJnet_Uri.JavaClass.parse(StringToJString('file://' + path));Intent.setDataAndType(Data, StringToJString('image/*'));tryTAndroidHelper.Activity.startActivity(Intent);excepton E: Exception dobeginShowMessage(E.Message)end;end;{$ENDIF ANDROID}endelsebeginShowMessage('不存在文件:' + path)end;end;end.
后記:如果你的項目是用舊版delphi建的,如10.2,那么,需要在10.3.1下重建這個項目,才能確保Secure File Sharing選擇項生效,生成正確的配置文件,不然,不會生成配置文件,有朋友遇到過。