使用API​​ 26 Delphi Android文件打开失败

时间:2018-06-10 13:20:12

标签: android delphi

我可以使用下面显示的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;  

1 个答案:

答案 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