Androidのフォトライブラリを起動し選択写真を表示 ~Delphiソースコード集
プロジェクトの作成とファイルの保存
ファイル⇒新規作成⇒マルチデバイス アプリケーション -Delphi をクリックします。「空のアプリケーション」を選択してOKを押します。
ターゲット設定、画面設計
(PCに実機をUSBで接続して)右上ペインのターゲットプラットフォームを展開して「Android64ビット」(接続した実機)をダブルクリックして切り替えます。右下ペインのパレットからTPanelをドラッグし、プロパティ「Align」を[Top]に設定します。
右下ペインのパレットからTImageをドラッグし、プロパティ「Align」を[Client]に設定します。
MultiResBitmapプロパティに白紙の画像ファイルを設定します。(2×2ドットのjpgファイルなどを事前に作成してあてがいます。)
右下ペインのパレットからTButtonをPanel1の上にドラッグします。
ソースコードの記述
startActivityForResultでフォトライブラリから選択された画像をもらう場合はExternal権限等が必要ありません。以下ソースコードを追加します。
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.StdCtrls,
FMX.Objects,FMX.Controls.Presentation,
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.GraphicsContentViewText,
System.Messaging, //TMessageManager TMessage
Androidapi.JNI.App, //TJActivity startActivityForResult
FMX.Surfaces, //TBitmapSurface
FMX.Helpers.Android //JBitmapToSurface
;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private 宣言 }
public
{ public 宣言 }
//「フォト」アプリを開いて写真が選択された後に
//メッセージをもらう時に使用するID
MessageSubscriptionID: Integer;
//「フォト」アプリを開いて写真を選択した後に
//メッセージをもらう関数
procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
end;
var
Form1: TForm1;
const
//「フォト」アプリを開く時に渡して「フォト」で写真が選択された
//メッセージをもらう時にこの値が返ってくる
REQUEST_CODE_VALUE:Integer=2345;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
var
Intent: JIntent;
begin
//メッセージハンドラを登録
MessageSubscriptionID :=
TMessageManager.DefaultManager.SubscribeToMessage(
TMessageResultNotification, HandleActivityMessage);
//Intent := TJIntent.Create;
Intent:=TJIntent.JavaClass.init;
Intent.setType(StringToJString('image/*'));
//以下の場合だと、android標準の「フォト」アプリ指定
Intent.setAction(TJIntent.JavaClass.ACTION_GET_CONTENT);
Intent.setPackage(StringToJString('com.google.android.apps.photos'));
//以下の場合は、写真を扱うアプリから選択する
//Intent.setAction(TJIntent.JavaClass.ACTION_PICK);
//REQUEST_CODE_VALUEでリクエストコードを送る
TAndroidHelper.Activity.startActivityForResult(
Intent, REQUEST_CODE_VALUE);
end;
procedure TForm1.HandleActivityMessage(const Sender: TObject;
const M: TMessage);
var
RequestCode, ResultCode: Integer;
Data: JIntent;
InputStream: JInputStream;
JavaBitmap: JBitmap;
BitmapSurface:TBitmapSurface;
begin
if M is TMessageResultNotification then
begin
RequestCode:=TMessageResultNotification(M).RequestCode;
ResultCode:=TMessageResultNotification(M).ResultCode;
Data:=TMessageResultNotification(M).Value;
//メッセージハンドラの解除
TMessageManager.DefaultManager.Unsubscribe(
TMessageResultNotification, MessageSubscriptionID);
//渡したリクエストコードと/戻り値のリクエストコードが一致する場合
if RequestCode=REQUEST_CODE_VALUE then
begin
if ResultCode=TJActivity.JavaClass.RESULT_OK then
begin
if Assigned(Data) then
begin
InputStream :=
TAndroidHelper.Activity.getContentResolver.openInputStream
(Data.getData);
//Java形式のBitmapに変換
JavaBitmap := TJBitmapFactory.JavaClass.decodeStream(InputStream);
//Java形式のBitmapからBitmapSurfaceへ変換
BitmapSurface := TBitmapSurface.Create;
JBitmapToSurface(JavaBitmap, BitmapSurface);
Image1.Bitmap.Assign(BitmapSurface);
BitmapSurface.Free;
end;
end;
end;
end;
end;
end.
