电话和短信链接在Delphi XE5 Android应用程序中的TWebbrowser中不起作用

时间:2014-04-14 12:11:48

标签: android delphi mobile firemonkey

我几天来一直在努力奋斗,并且感谢任何人都能给予的帮助。电话:和短信:链接在Android上的任何网络浏览器中都可以正常工作。但它们在TWebBrowser中根本不起作用。

我发现这个code for opening links natively,工作正常,但我无法弄清楚如何从TWebBrowser中激活一个函数。有一些仅涉及Windows的解决方案涉及类型库,但似乎没有任何东西可以在Android上运行。

有没有办法在Delphi XE5 Firemonkey移动应用程序中通过TWebBrowser中的网页调用本机函数?或者,有没有办法在TWebBrowser中实际使用Tel和SMS链接?

2 个答案:

答案 0 :(得分:1)

如果有人想知道这一点,正如我的问题所述,Android上的XE5上的TWebbrowser无法打开您在webview应用程序中找到的一些最有用的链接 - 即SMS,Tel或Mailto链接。< / p>

我通过重写FMX.Webbrowser.Android中的shouldOverrideUrlLoading函数解决了这个问题。要使用修改后的单元,请将FMX.Webbrowser.Android.pas复制到项目目录,然后将其添加到项目中。然后更改以下原始功能:

    function TAndroidWebBrowserService.TWebBrowserListener.shouldOverrideUrlLoading(
  P1: JWebView; P2: JString): Boolean;
begin
  Result := False;
end;

    function TAndroidWebBrowserService.TWebBrowserListener.shouldOverrideUrlLoading(
  P1: JWebView; P2: JString): Boolean;
  var
  oUrl,lURL:string;
  intent:jintent;
begin
oUrl:=jstringtostring(p2);
lUrl:=lowercase(oURL);
if ((pos('sms:',lUrl)>0) or (pos('tel:',lUrl)>0) or (pos('mailto:',lUrl)>0)) then
begin
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
    TJnet_Uri.JavaClass.parse(StringToJString(oURL)));
  try
    SharedActivity.startActivity(Intent);
    p1.stopLoading;
    exit(true);
  except
    on e: Exception do
    begin
      exit(false);
    end;
  end;
  exit(true);
end;
  Result := False;
end;

就是这样。 FMX.Webbrowser.Android的默认位置是C:\ Program Files(x86)\ Embarcadero \ RAD Studio \ 12.0 \ source \ fmx

答案 1 :(得分:0)

我通过使用事件TWebBrowser(FMX)解决了这个问题 onShouldStartLoadWithRequest 和 onDidFailLoadWithError

    procedure TForm9.WebBrowser1DidFailLoadWithError(ASender: TObject);
    begin
      if (BackByError) then
      begin
        ProccessURL;
        Timer2.Enabled := True;
      end;
    end;

    procedure TForm9.WebBrowser1ShouldStartLoadWithRequest(ASender: 
                                                            TObject;   
                                                       const URL: string);
    var
      IPos1, IPos2 : Integer;
      aURL : String;
    begin
      aURL := URL;
      IPos1 := Pos('tel:', aURL);
      IPos2 := Pos('mailto:', aURL);
      BackByError := (IPos1 > 0) or (IPos2 > 0);
      if (BackByError) then
        URLError := aURL;
    end;

    procedure TForm9.ProccessURL;
    var
      i : JIntent;
      Uri : JNet_Uri;
    begin
      Uri := TJnet_Uri.JavaClass.parse(stringtojstring(URLError));
      i := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);
      try
        SharedActivity.startActivity(i);
      except
        on e: Exception do
        begin
          ShowMessage('Error: ' + e.Message);
        end;
      end;
    end;

    procedure TForm9.Timer2Timer(Sender: TObject);
    begin
      if (BackByError) and (WebBrowser1.CanGoBack) then
      begin
        BackByError := False;
        WebBrowser1.GoBack;
        Timer2.Enabled := False;
      end;
    end;