delphi 如何找到错误的原因:“找不到包含”

gopyfrb3  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(153)

我有一个错误,我找不到它的原因。生成URI时出错。
我浏览了关于这个主题的几个主题,在这里进行了讨论。但是,错误无法纠正。我想在某个地方有一个错字。我怎样才能找到我错在哪里?

var
files: Tfile;
lIntent: JIntent;
lJRecipient: TJavaObjectArray<JString>;
lURI: Jnet_Uri;
LAuthority: JString;
lJFile: JFile;
lFileName: string;
lFilePath: string;
lFilePathFileName: string;
Surf : TBitmapSurface;
begin
 lFileName := Concat('Foto','Code' ,'.jpg') ;
 lFilePath := System.IOUtils.TPath.GetPublicPath;
 lFilePathFileName := System.IOUtils.Tpath.Combine(lFilePath, lFileName) ;
 Surf:=TBitMapSurface.Create;
 SaveParams.Quality:=100;
 try
  Surf.Assign(imResult.Bitmap);
  TbitMapCodecManager.SaveToFile(lFilePathFileName, Surf, @SaveParams);
finally
  Surf.Free;
end;

  lIntent:= TJIntent.Create;
  lIntent.setType(StringToJString('message/rfc822'));
  lIntent.setAction(TJIntent.JavaClass.ACTION_SEND);
  lIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  lIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, lJRecipient);
  lIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString('Text'));
  lIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('.....'));
  LAuthority := StringToJString(JStringToString(
  TAndroidHelper.Context.getApplicationContext.getPackageName)+'.fileprovider');
  lJFile:= TJFile.JavaClass.init(StringToJString(lFileName));
  lUri := TJFileProvider.JavaClass.getUriForFile(
    TAndroidHelper.Context,  LAuthority, lJFile);

我已经包括在清单文件中

<provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="com.embarcadero.ScanDecoder.fileprovider"
                android:grantUriPermissions="true"
                android:exported="false">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/filepaths" />
            </provider>

已创建文件\res\xml\filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="MyFoto" path="."/>
</paths>

我尝试将文件中的路径更改为以下内容。我仍然得到这个错误。

path="."
path="./"
path="files/"
path=".files/"

我哪里做错了?

w3nuxt5m

w3nuxt5m1#

@Dave Notage建议了使用FileProvider的正确方法。当您在项目选项的权限列表中启用“安全文件共享”选项时,将自动生成xml清单和提供程序路径。现在起作用了我提供了一个可行的解决方案。

procedure TestSendEmail();
{$IF DEFINED(ANDROID)}
 var
  lIntent: JIntent;
  lJRecipient: TJavaObjectArray<JString>;
  lURI: Jnet_Uri;
  lFileName: string;
  lFilePath: string;
  lFilePathFileName: string;

  Delim :Char;
//  Surf : TBitmapSurface;
{$ENDIF}

begin
 lFileName := Concat('MyFile' ,'.jpg') ;
 lFilePath := System.IOUtils.TPath.GetPublicPath ;
 lFilePathFileName := System.IOUtils.Tpath.Combine(lFilePath, lFileName) ;
 Surf:=TBitMapSurface.Create;
 SaveParams.Quality:=100;
 try
   Surf.Assign(imResult.Bitmap);
 // Save file
   TbitMapCodecManager.SaveToFile(lFilePathFileName, Surf, @SaveParams);
 finally
   Surf.Free;
 end;
{$IF DEFINED(ANDROID)}
  lJRecipient:= TJavaObjectArray<JString>.Create(1);
  lJRecipient.Items[0]:= StringToJString('xxxxxxx@yyyy.com');

  lIntent:= TJIntent.Create;

  lIntent.setType(StringToJString('message/rfc822'));
  lIntent.setAction(TJIntent.JavaClass.ACTION_SEND);
  lIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  lIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, lJRecipient);
  lIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString('Subj'));
  lIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('Text'));

  lUri:= TAndroidHelper.JFileToJURI(
      TJFile.JavaClass.init(StringToJString(lFilePathFileName)));

  lIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,TJParcelable.Wrap(lUri)) ;

  try
    TAndroidHelper.Activity.startActivity(lIntent);
  except
    on E: Exception do
    begin
      ShowMessage( E.Message);
    end;
  end;
{$ENDIF}
end;

相关问题