Einzelnen Beitrag anzeigen

philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
898 Beiträge
 
Delphi 10.4 Sydney
 
#1

Android ACTION_GET_CONTENT abbrechen?

  Alt 7. Mai 2021, 15:50
Hi,

ich sitze gerade daran meine App an das nun verpflichtende Android-Berechtigungskonzept anzupassen.
Daher kann der User jetzt Dateien im Android-Auswahl-Dialog auswählen und
diese kopiere ich dann in mein App-Verzeichnis, bevor ich wieder normal weiterarbeiten kann.
Die Kopie ist nicht weiter tragisch, wäre später eh passiert.

Was mich jetzt noch stört ist, dass ich nicht sehe, wie man den Android-Auswahl-Dialog abbrechen kann,
damit es in meiner App weitergeht, aber eben als wäre unter Windows "Abbrechen" im Auswahl-Dialog geklickt worden.

Wie kann man den Android-Auswahl-Dialog abbrechen?

Aufruf des Android-Auswahl-Dialoges:
Delphi-Quellcode:

  uses: FMX.Helpers.Android, Androidapi.JNIBridge,Androidapi.Jni

  ...
  TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessageGPXRead);
  Intent := TJIntent.Create;
  Intent.setType(StringToJString('*/*'));
  Intent.setAction(TJIntent.JavaClass.ACTION_GET_CONTENT);
  MainActivity.startActivityForResult(Intent, 0);
  ...
Verarbeitung der ausgewählten Datei:
Delphi-Quellcode:
procedure TForm.HandleActivityMessageGPXRead(const Sender: TObject; const M: TMessage);
var
  Data:JIntent;
  C: JCursor;
  I: integer;
  uri,filename:String;
  ms: TMemoryStream;
  fs: TFileStream;
  jis: JInputStream;
  b: TJavaArray<Byte>;
begin
  if (M is TMessageResultNotification) then
  begin
    data:=TMessageReceivedNotification(M).Value;
    uri:=JStringToString(Data.getData.toString);
    C := MainActivity.getContentResolver.query(Data.getData, nil {P}, StringToJString(''),nil, StringToJString(''));
    C.moveToFirst;
    for I := 0 to C.getColumnCount - 1 do
    begin
      if JStringToString(C.getColumnName(I)) = '_display_namethen
      begin
        filename:=JStringToString(C.getString(I));
        Break;
      end;
    end;
    if ((not lowercase(filename).endsWith('.gpx')) and (not lowercase(filename).endsWith('.zip'))) then
    begin
      message:='The file '+filename+ ' is not a GPX-File.';
      exit;
    end;
    ms := TMemoryStream.Create();
    try
      jis := TAndroidHelper.Context.getContentResolver.openInputStream(Data.getData);
      b := TJavaArray<Byte>.Create(jis.available);
      jis.read(b);
      ms.Write(b.Data^, b.Length);
      jis.close;
      filename:=TFileUtils.adjustDir(eConfigMyExerciseDirectory.text)+filename;
      ms.saveToFile(filename);
    finally
      ms.free();
    end;
    //meine Standard-Verarbeitung für diese Datei: readExerciseFromGPX(btWizardGPXRead,filename);
  end;
end;
Grüße, Philipp

Geändert von philipp.hofmann ( 7. Mai 2021 um 15:55 Uhr)
  Mit Zitat antworten Zitat