URLスキームでAndroidアプリを起動しパラメータを渡す ~Delphiソースコード集
HTML側のソース
この例では以下のhtmlファイルにandoroidアプリケーションを起動するHTMLを記述します。https://mammam.info/url_scheme.html
スキーマ名をscheme、 ホスト名をhostとしています。
スキーマ名とホスト名は任意ですが、URLスキームで起動するアプリのAndroidManifest.xml内で名前を合わせる必要があります。
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<script>
function go(){
document.getElementById("a").href=
"scheme://host/?a="+ document.getElementById("text").value;
document.getElementById("a").click();
}
</script>
</head>
<body>
<input type="text" maxlength="10" size="20" id="text" name="text" value="テスト"><br>
<input type="button" value="アプリを起動してパラメータを引き継ぐ" onclick="go()">
<a id="a"></a>
<body/>
</html>
Delphiを起動してFMXアプリケーションを作成して画面を設定する
DelphiのIDEで以下のような画面を作成し、すべて保存します。
AndroidManifest.template.xmlを編集
プロジェクトフォルダ直下にあるAndroidManifest.template.xmlをテキストエディタで開いて編集します。スキーマ名とホスト名はHTMLファイルに記述した値と合わせます。
・・・省略・・・
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="scheme" android:host="host" />
</intent-filter>
</activity>
<%activity%>
<%receivers%>
</application>
</manifest>
DelphiのAndroid用ソースコード
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Platform, System.Messaging ;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ private 宣言 }
procedure OnNewintent(const Sender:TObject;const M:TMessage);
public
{ public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses
Androidapi.Helpers, Androidapi.JNI.JavaTypes
,Androidapi.JNI.GraphicsContentViewText
,Androidapi.JNI.Os, Androidapi.Jni.Support
,Androidapi.Jni.net, Androidapi.JNI.App, FMX.Platform.Android
,IdURI,IdGlobal ;
procedure TForm1.Button1Click(Sender: TObject);
var Intent:JIntent;
const url='https://mammam.info/url_scheme.html';
begin
Intent:=TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setData(StrToJURI(url));
TAndroidHelper.Activity.startActivity(Intent);
end;
//アプリが起動していてインテントが届いた場合
procedure TForm1.OnNewintent(const Sender: TObject; const M: TMessage);
var Intent: JIntent;
Uri: Jnet_Uri;
begin
if M is TMessageReceivedNotification then
begin
Intent:=TMessageReceivedNotification(M).Value;
Uri := Intent.getData;
//URLスキームで届いたパラメータを表示する
Label1.Text:=
TIdURI.URLDecode(
JStringToString(Uri.getEncodedQuery),
IndyTextEncoding_UTF8()
);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var Intent: JIntent;
Uri: Jnet_Uri;
APPEventService:IFMXApplicationEventService;
begin
Intent := TAndroidHelper.Activity.getIntent;
if TJIntent.JavaClass.ACTION_VIEW.equals(Intent.getAction) then
begin
//アプリ起動時にインテントがあれば取得する
Uri:=Intent.getData;
Label1.Text:=
TIdURI.URLDecode(
JStringToString(Uri.getEncodedQuery),
IndyTextEncoding_UTF8()
);
end;
//アクション[android.intent.action.VIEW]を受け取るように設定
MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW);
//メッセージが送られた時に処理(OnNewIntent)を実行するハンドラを登録
//TMessageReceivedNotification は TMessage<JIntent>なので、
//Intentが送られてきたら、関数OnNewIntentが実行される
TMessageManager.DefaultManager.SubscribeToMessage(
TMessageReceivedNotification, OnNewIntent
);
end;
end.
実行
コンパイルしてandroid実機に転送します。ブラウザを開いてhttps://mammam.info/url_scheme.htmlを表示します。
