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_name'
then
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