【问题标题】:(Delphi 10.2) How can I open a URL in Android's web browser from my application?(Delphi 10.2) 如何从我的应用程序在 Android 的网络浏览器中打开 URL?
【发布时间】:2018-08-18 10:48:34
【问题描述】:

Delphi 10.2.2 Firemonkey Android 问题:如何从我的应用程序在 Android 的网络浏览器中打开 URL?

我试图理解这里的概念:How can I open a URL in Android's web browser from my application? 但这些信息对我没有任何帮助。与我目前拥有的代码相比,我无法思考他们如何让它工作。

我也看过这里:http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FMX.Android_Intents_Sample

我也看过这里:https://developer.android.com/guide/components/intents-common.html?hl=en

我试过这段代码:

function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
var
  Intent: JIntent;
begin
// There may be an issue with the geo: prefix and URLEncode.
// will need to research
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
    TJnet_Uri.JavaClass.parse(StringToJString(System.NetEncoding.TNetEncoding.URL.Encode(URL))));
  try
    TAndroidHelper.Activity.startActivity(Intent);
    exit(true);
  except
    on e: Exception do
    begin
      if DisplayError then ShowMessage('Error: ' + e.Message);
      exit(false);
    end;
  end;
end;

这就是我使用该功能的方式:

OpenURL('https://www.patreon.com/phonelosers/overview/', true)

它一直给我一个错误:

错误:android.content.ActivityNotFoundException:找不到处理 Intent 的 Activity { act=android.intent.action.VIEW dat=https://www.patreon.com/phonelosers/overview/ }

我也试过这个代码:

function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
var
  Intent: JIntent;
begin
// There may be an issue with the geo: prefix and URLEncode.
// will need to research
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
    TJnet_Uri.JavaClass.parse(StringToJString(System.NetEncoding.TNetEncoding.URL.Encode(URL))));
  if TAndroidHelper.Activity.getPackageManager.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size > 0 then
  begin
    try
      TAndroidHelper.Activity.startActivity(Intent);
      exit(true);
    except
      on e: Exception do
      begin
        if DisplayError then ShowMessage('Error: ' + e.Message);
        exit(false);
      end;
    end;
  end
  else
  begin
    ShowMessage('Intent.resolveActivity <= 0');
  end;
end;

这给了我“Intent.resolveActivity

我使用哪款安卓手机并不重要。我有运行 Android 版本 6.0.1、7.0、8.0 的 Moto G Play、Samsung S8+ 和 Moto Z2 Force。所有手机都安装了 chrome 浏览器,我可以使用它。

我浏览了整个网络,下面的代码是每个人用来做我需要做的事情的代码。我查看了 Delphi 和 Android 编程信息。

请帮助解决这个 Delphi 10.2.2 Firemonkey Android 问题!

【问题讨论】:

    标签: android delphi url browser


    【解决方案1】:

    使用不同的编码方式后:

    procedure OpenURL(const URL: string);
    var
      LIntent: JIntent;
      Data: Jnet_Uri;
    begin
      LIntent := TJIntent.Create;
      Data := TJnet_Uri.JavaClass.parse(StringToJString(URL));
      LIntent.setData(Data);
      LIntent.setAction(StringToJString('android.intent.action.VIEW'));
      TAndroidHelper.Activity.startActivity(LIntent);
    end;
    

    我发现我忘记了“System.NetEncoding.TNetEncoding.URL.Encode”,只是从源代码中删除该代码解决了问题,因此该代码:

    function OpenURL(const URL: string; const DisplayError: Boolean = False): Boolean;
    var
      Intent: JIntent;
    begin
    // There may be an issue with the geo: prefix and URLEncode.
    // will need to research
      Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
        TJnet_Uri.JavaClass.parse(StringToJString(URL)));
      try
        TAndroidHelper.Activity.startActivity(Intent);
        exit(true);
      except
        on e: Exception do
        begin
          if DisplayError then ShowMessage('Error: ' + e.Message);
          exit(false);
        end;
      end;
    end;
    

    现在可以了!

    由于这个 System.NetEncoding.TNetEncoding.URL.Encode 引起了这个问题,我想知道我是否需要对我的 url 进行特殊编码,我应该使用什么?

    【讨论】:

      【解决方案2】:

      使用此代码:

      var
        URL: string;
        Intent: JIntent;
      begin
        URL := 'https://www.google.com';
        Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW,
            TJnet_Uri.JavaClass.parse(StringToJString(URL)));
        SharedActivity.startActivity(Intent);
      end
      

      【讨论】:

        猜你喜欢
        • 2011-01-13
        • 2017-11-06
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        相关资源
        最近更新 更多