如何使用FireMonkey跨平台应用程序使用默认浏览器打开URL?

Whi*_*ler 28 browser delphi delphi-xe2 firemonkey

通常,我使用: ShellExecute(0, 'OPEN', PChar(edtURL.Text), '', '', SW_SHOWNORMAL);

如何在所有平台(Windows OSX)上具有相同的行为(在默认浏览器中打开链接)?

Whi*_*ler 19

关于mjn的答案,我写了以下单元.我已经在Windows上成功测试了它,但我没有OSX在这个平台上测试它.如果有人能证实它有效,我会很感激.

unit fOpen;

interface

uses
{$IFDEF MSWINDOWS}
  Winapi.ShellAPI, Winapi.Windows;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
  Posix.Stdlib;
{$ENDIF POSIX}

type
  TMisc = class
    class procedure Open(sCommand: string);
  end;

implementation

class procedure TMisc.Open(sCommand: string);
begin
{$IFDEF MSWINDOWS}
  ShellExecute(0, 'OPEN', PChar(sCommand), '', '', SW_SHOWNORMAL);
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}
  _system(PAnsiChar('open ' + AnsiString(sCommand)));
{$ENDIF POSIX}
end;

end.
Run Code Online (Sandbox Code Playgroud)

我称之为:

TMisc.Open('https://stackoverflow.com/questions/7443264/how-to-open-an-url-with-the-default-browser-with-firemonkey-cross-platform-applic');
Run Code Online (Sandbox Code Playgroud)

  • 在Windows 32和64位以及Mac OSX上测试:它可以工作; o) (3认同)

mjn*_*mjn 13

在FireMonkey论坛中,我找到了有关NSWorkspace.URLForApplicationToOpenURL的问题的代码:

uses
  Posix.Stdlib;
....
  _system(PAnsiChar('open ' + ACommand));
Run Code Online (Sandbox Code Playgroud)

(未经我测试)


更新:Posix在Windows上不可用,因此无法编写在所有平台上使用相同OS调用的解决方案.我建议将这些代码移到一个中央的'XPlatform'单元中,它有一些IFDEF POSIX等.

  • 如果在项目视图中切换到OSX平台,将找到Posix单元. (2认同)

小智 6

对于所有平台(Windows,macO,iOS和Android),您都可以使用我为博客撰写的单元

unit u_urlOpen;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
{$IF Defined(IOS)}
  macapi.helpers, iOSapi.Foundation, FMX.helpers.iOS;
{$ELSEIF Defined(ANDROID)}
Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.Net,
   Androidapi.JNI.App,
  Androidapi.helpers;
{$ELSEIF Defined(MACOS)}
Posix.Stdlib;
{$ELSEIF Defined(MSWINDOWS)}
Winapi.ShellAPI, Winapi.Windows;
{$ENDIF}

type
  tUrlOpen = class
    class procedure Open(URL: string);
  end;

implementation

class procedure tUrlOpen.Open(URL: string);
{$IF Defined(ANDROID)}
var
  Intent: JIntent;
{$ENDIF}
begin
{$IF Defined(ANDROID)}
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setData(StrToJURI(URL));
  tandroidhelper.Activity.startActivity(Intent);
  // SharedActivity.startActivity(Intent);
{$ELSEIF Defined(MSWINDOWS)}
  ShellExecute(0, 'OPEN', PWideChar(URL), nil, nil, SW_SHOWNORMAL);
{$ELSEIF Defined(IOS)}
  SharedApplication.OpenURL(StrToNSUrl(URL));
{$ELSEIF Defined(MACOS)}
  _system(PAnsiChar('open ' + AnsiString(URL)));
{$ENDIF}
end;

end.
Run Code Online (Sandbox Code Playgroud)