Android Delphi XE5安卓应用程序中的TWebbrowser无法使用电话和短信链接

Android Delphi XE5安卓应用程序中的TWebbrowser无法使用电话和短信链接,android,delphi,mobile,firemonkey,Android,Delphi,Mobile,Firemonkey,我已经为此挣扎了好几天,非常感谢任何人能给予我的帮助。电话:和短信:链接在Android上的任何网络浏览器中都可以正常工作。但它们在TWebBrowser内部根本不起作用 我发现它工作得很好,但我不知道如何从TWebBrowser内部启动函数。有一些仅适用于Windows的解决方案涉及类型库,但在Android上似乎什么都不起作用 在Delphi XE5 Firemonkey移动应用程序中,有没有办法从TWebBrowser中的网页调用本机函数?或者,有没有办法让电话和短信链接在TWebBrow

我已经为此挣扎了好几天,非常感谢任何人能给予我的帮助。电话:和短信:链接在Android上的任何网络浏览器中都可以正常工作。但它们在TWebBrowser内部根本不起作用

我发现它工作得很好,但我不知道如何从TWebBrowser内部启动函数。有一些仅适用于Windows的解决方案涉及类型库,但在Android上似乎什么都不起作用


在Delphi XE5 Firemonkey移动应用程序中,有没有办法从TWebBrowser中的网页调用本机函数?或者,有没有办法让电话和短信链接在TWebBrowser中正常工作

如果有人对此感到疑惑,正如我在问题中所述,Android上XE5上的TWebbrowser不会打开webview应用程序中最有用的一些链接,即SMS、Tel或Mailto链接

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

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


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

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

    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;
    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;