我可以使用下面显示的Delphi代码在Android上打开文件。但是当我在API 26上编译它时,它会给出我在下面的图片中添加的错误。我该如何解决这个问题?
ExtFile := AnsiLowerCase(StringReplace(TPath.GetExtension(yol), '.', '',[]));
mime := TJMimeTypeMap.JavaClass.getSingleton();
ExtToMime := mime.getMimeTypeFromExtension(StringToJString(ExtFile));
Intent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setDataAndType(StrToJURI('file:' + yol), ExtToMime);
SharedActivity.startActivity(Intent);
非常感谢你的帮助。我很高兴我终于在这个平台上遇到了这种理解的人。我试过你发送的.pas文件。但我看到一个不同的错误窗口。我分享我的代码和错误。非常感谢你。
var
ExtFile,yol,deger,id:string;
mime: JMimeTypeMap;
ExtToMime: JString;
Intent: JIntent;
javafile:JFile;
begin
yol:='/sdcard/SkyWiFiDownload/sancak.jpg';
javafile:=TJFile.JavaClass.init(StringToJString(yol));
ExtFile := AnsiLowerCase(StringReplace(TPath.GetExtension(yol), '.', '',[]));
mime := TJMimeTypeMap.JavaClass.getSingleton();
ExtToMime := mime.getMimeTypeFromExtension(StringToJString(ExtFile));
Intent := TJIntent.Create;
id:=JStringToString(TAndroidHelper.Context.getApplicationContext.
getPackageName) + '.fileprovider';
deger:=JURIToStr(TJFileProvider.JavaClass.getUriForFile(
TAndroidHelper.Context,StringToJString(id),javafile));
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setFlags(1);
Intent.setDataAndType(StrToJURI(deger), ExtToMime);
SharedActivity.startActivity(Intent);
end;
答案 0 :(得分:1)
我终于想出了必要的步骤来完成这项工作。首先,您将需要修改AndroidManifest.Template.xml文件以添加Provider部分,如下所示:
...
<application android:persistent="%persistent%"
android:restoreAnyVersion="%restoreAnyVersion%"
android:label="%label%"
android:debuggable="%debuggable%"
android:largeHeap="%largeHeap%"
android:icon="%icon%"
android:theme="%theme%"
android:hardwareAccelerated="%hardwareAccelerated%">
<!-- **** ADD THIS SECTION **** -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.embarcadero.yourAppName.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
</provider>
<%application-meta-data%>
<%services%>
...
对于值:
android:authorities="com.embarcadero.yourAppName.fileprovider"
更改:将com.embarcadero.yourAppName更改为您的软件包名称。
您还将需要创建一个文件: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>
..并使用Deployment Manager将其添加到您的项目部署中,其Remote Path值为:res \ xml \
从以下位置更改您的Delphi代码:
Intent.setDataAndType(StrToJURI(deger), ExtToMime);
收件人:
Intent.setDataAndType(TAndroidHelperEx.UriFromFile(javafile), ExtToMime);
TAndroidHelperEx来自此单元:
https://github.com/DelphiWorlds/KastriFree/blob/master/Core/DW.Android.Helpers.pas
它依靠本机:
https://github.com/DelphiWorlds/KastriFree/blob/master/API/DW.Androidapi.JNI.FileProvider.pas