Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android: Datei öffnen mit Std. Anwendung (https://www.delphipraxis.net/188372-android-datei-oeffnen-mit-std-anwendung.html)

greenmile 25. Feb 2016 10:43

Android: Datei öffnen mit Std. Anwendung
 
Hallo,

ich möchte in meiner Android App einen Videostream öffnen; unter Windows nehme ich dazu einfach ShellExecute. Ich verwende aktuell folgenden Code:

Code:
function OpenVideo(const URL: string): Boolean;
var Intent: JIntent;
begin
  try
    Intent := TJIntent.Create;
    Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
    Intent.setDataAndType(StrToJURI(URL), StringToJString('video/mpg'));
    SharedActivity.startActivity(Intent);
    Result := true;
  except
    Result := false;
  end;
end;
{$ENDIF}
Das funktioniert auch fast perfekt, allerdings nicht auf einem HTC. Dort muss ich mittels Zurück-Taste das Video beenden und das beendet dann meine App. Es muss noch eine andere Art und Weise geben, bei der ich die Anwendung auswählen kann, dann kommt "Wählen Sie aus, mit was Sie das Video abspielen möchten". Kennt die jemand? Oder ev. einen anderen Weg, um den Default-Videoplayer aufzurufen?

bra 25. Feb 2016 10:52

AW: Android: Datei öffnen mit Std. Anwendung
 
Wir haben das bei uns so gelöst:

Delphi-Quellcode:
const
cFileUrlPrefix = 'file://';

function GetMimeType: JString;
var
  jstr: JString;
begin
  // MIME-Type auslesen
  result := StringToJString('application/pdf'); // Standard
  jstr := TJMimeTypeMap.JavaClass.getFileExtensionFromUrl(StringToJString(cFileUrlPrefix + FFilename));
  if jstr <> nil then begin
    jstr := TJMimeTypeMap.JavaClass.getSingleton.getMimeTypeFromExtension(jstr);
    if jstr <> nil then
      result := jstr;
  end;
end;

procedure TShareButton.DoOpenAction;
var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  Intent.setDataAndType(TJnet_Uri.JavaClass.parse(StringToJString(cFileUrlPrefix + FFileName)), GetMimeType);
  TAndroidHelper.Activity.startActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Bitte App auswählen...')));
end;

greenmile 25. Feb 2016 10:59

AW: Android: Datei öffnen mit Std. Anwendung
 
Woher kommt "TJMimeTypeMap"?

bra 25. Feb 2016 11:00

AW: Android: Datei öffnen mit Std. Anwendung
 
Zitat:

Zitat von greenmile (Beitrag 1331327)
Woher kommt "TJMimeTypeMap"?

Ich habe die IDE gerade nicht zur Hand, das sind alle Android-Uses:
Delphi-Quellcode:
Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Net,
  Androidapi.JNI.Provider, Androidapi.JNI.Webkit, Androidapi.JNI.App, FMX.Helpers.Android

greenmile 25. Feb 2016 11:19

AW: Android: Datei öffnen mit Std. Anwendung
 
Hey super, vielen Dank. Hier der Code für XE8:

Code:
Uses ... Androidapi.JNI.Webkit;

function GetMimeType(FFilename: String; IsLocalFile: Boolean): JString;
{$IFDEF ANDROID}
  var jstr: JString;
  const _Default = 'video/mp4';
begin
  Try
    result := StringToJString(_Default); // Standard
    If IsLocalFile then jstr := TJMimeTypeMap.JavaClass.getFileExtensionFromUrl(StringToJString(cFileUrlPrefix + FFilename))
    Else jstr := TJMimeTypeMap.JavaClass.getFileExtensionFromUrl(StringToJString(FFilename));
    if jstr <> nil then begin
      jstr := TJMimeTypeMap.JavaClass.getSingleton.getMimeTypeFromExtension(jstr);
      if jstr <> nil then result := jstr;
    end;
  Except
    Result := StringToJString(_Default);
  End;
end;
{$ELSE}
begin
  raise Exception.Create('Not supported!');
end;
{$ENDIF}

Function OpenVideo(const URL: string; IsLocalFile: Boolean): Boolean;
{$IFDEF ANDROID}
var
   Intent: JIntent;
begin
  Try
    Intent := TJIntent.Create;
    Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
    Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
    If IsLocalFile then Intent.setDataAndType(TJnet_Uri.JavaClass.parse(StringToJString(cFileUrlPrefix + URL)), GetMimeType(URL,IsLocalFile) )
    Else Intent.setDataAndType(TJnet_Uri.JavaClass.parse(StringToJString(URL)), GetMimeType(URL,IsLocalFile) );
    SharedActivity.startActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Bitte App auswählen...')));
    Result := true;
  Except
    Result := false;
  End;
end;
{$ELSE}
begin
  raise Exception.Create('Not supported!');
end;
{$ENDIF}


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz