Delphiでお手軽プログラミング

Delphiでお手軽プログラミングメニュー

AndroidでTWebBrowser(WebView)に基本認証のWEBサイトを表示する


Delphiを起動して新規作成を行う

Delphiを起動し、ファイル→新規作成→マルチデバイスアプリケーションをクリックし、 空のアプリケーションを選択してOKボタンを押してプロジェクトを作成します。
TButtonとTWebBrowserをフォームにドラッグ&ドロップします。
ターゲットプラットフォームをAndroid(実機をUSB接続している場合は実機)に切り替えます。
(以下の画像ではPixel 3a XLをダブルクリック)
すべて保存を押して、プロジェクトフォルダを作成してプロジェクトとユニットを保存します。


FMX.WebBrowser.Android.pasファイルをプロジェクトフォルダ内にコピーする

C:\Program Files (x86)\Embarcadero\Studio\20.0\source\fmx\FMX.WebBrowser.Android.pas
ファイルを、上記で保存したプロジェクトファイルと同じフォルダ内にコピーします。

FMX.WebBrowser.Android.pasファイルをプロジェクトに追加

プロジェクトに追加(Shift+F11)を押して、プロジェクトフォルダ内にコピーした「FMX.WebBrowser.Android.pas」ファイルを選択し、[開く]ボタンを押します。

ソースコードを記述する

Button1をダブルクリックしてソースコードを記述します。
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('ベーシック認証があるURL');
end;

(例)WebBrowser1.Navigate('https://mam-mam.net/sec/');

参考:
AndroidのWebViewは、基本的にhttps(SSL/TLSが有効な)サイトを開くのが通常のようです。
http(SSL/TLS無効な)サイトを開く場合は、プロジェクトフォルダ内にある
AndroidManifest.template.xml
ファイルを編集して以下の赤文字の行を追加しましょう。
    <application android:persistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android:label="%label%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%"
        android:usesCleartextTraffic="true"
        android:resizeableActivity="false">

FMX.WebBrowser.Android.pasの編集

実行ボタンを押して実機転送して実行して、Button1を押してもUnauthorizedエラーが発生するだけなので、 プロジェクトフォルダ内にコピーしたFMX.WebBrowser.Android.pasファイルを編集します。

20行目のusesに, System.NetEncodingを追加します。
uses
  System.Classes, System.Types, System.StrUtils, System.SysUtils,  System.RTLConsts, Androidapi.JNI.Webkit,
  AndroidApi.JNI.App, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
  Androidapi.JNIBridge, Androidapi.JNI.Os, Androidapi.JNI.Net, Androidapi.Helpers, Androidapi.JNI.Widget, FMX.Forms, 
  FMX.Helpers.Android, FMX.Graphics, FMX.Surfaces, FMX.ZOrder.Android, FMX.Platform, FMX.Platform.Android, FMX.WebBrowser, FMX.Types
  , System.NetEncoding;

314行目あたりにあるTAndroidWebBrowserService.DoNavigate(const AURL: string)関数を編集します。
procedure TAndroidWebBrowserService.DoNavigate(const AURL: string);
var
  NewURL: string;
  LFile: string;
  hm: JHashMap;
  hd:JMap;
  ba:string;
begin
  NewURL := AURL;
  if Pos(TWebBrowser.FilesPref, AURL) <> 0 then
  begin
    LFile := Copy(AURL, length(TWebBrowser.FilesPref) + 1, length(AURL));
    if not FileExists(LFile) then
      raise EFileNotFoundException.Create(SSpecifiedFileNotFound);
    NewURL := ReplaceStr(NewURL, TWebBrowser.FilesPref, TWebBrowser.FilesPref + '/');
  end
  else if Pos('http', AURL) = 0 then
    Insert('http://', NewURL, 0);

  ba:='基本認証ユーザー名'+':'+'基本認証パスワード';
  ba:=TNetEncoding.Base64.Encode(ba);
  hm:=TJHashmap.Create;
  hm.put(
    StringToJString('Authorization'),
    StringToJString('Basic '+ba)
  );
  hd:=TJMap.Wrap((hm as ILocalObject).getObjectID);

  FWebView.loadUrl(StringToJString(NewURL),hd);
  ShouldStartLoading(NewURL);
  UpdateContentFromControl;
end;
(上記ba変数代入の例)ba:='user'+':'+'pass';

実行

実行ボタンを押すと、アプリが実機に転送され、アプリが実行されます。
アプリが起動したら、Button1をタップすると、基本認証が設定されたページが開きます

Copyright 2019 Mam