출처 : FMXExpress/android-object-pascal-wrapper
Android JNI Bridge and Custom Classes.dex
Java2OP.exe, the Native Bridge File Generator for Android
파이어몽키에서 안드로이드 외부 라이브러리(jar 파일) 이용(Import jar)
델파이 파이어몽키 안드로이드 앱 내에 스플래시 스크린추가
Creating a splash screen for Delphi XE6 Android apps
Delphi XE6のAndroidアプリケ?ションで、Intentを使ってアクティビティを開始して?り値を取得するサンプル
android-file-dialog
안드로이드 TOpenDialog 구현
FireMonkey의 Android에서 TOpenDialog가 동작하지 않아 android-file-dialog를 이용해서 TOpenDialog처럼 파일를 선택 할 수 있도록 구현 해보았습니다.
android-file-dialog 파일을 받아서 컴파일 해서 jar로 묶고 FireMonkey 프로젝트를 만들고 jar를 추가했습니다.
XE7부터는 classes.dex로 만들지 않고, jar 형태의 라이브러리를 바로 추가 할수 있고, java2op 유틸리티로 브릿지 파일을 생성 할 수 있어서 편하게 안드로이드용 라이브러리 추가가 가능합니다.
안드로이드 브릿지 파일 생성
유틸리티 java2op로 안드로이드 브릿지 파일(Androidapi.JNI.Interfaces.pas)를 생성 합니다.
java2op -jar lib_fileexplorer.jar
라이브러리 jar 추가

AndroidManifest.template.xml 파일 수정
<!-- bluexmas -->
<activity android:name="com.lamerman.FileDialog"
android:configChanges="orientation|keyboard" />
리소스 추가
메뉴 > Project > Deployment 선택

Activity 화면 전환
Intent := TJIntent.JavaClass.init;
Intent.setClassName(SharedActivityContext, StringToJString('com.lamerman.FileDialog'));
SharedActivity.startActivityForResult(Intent, 0);
결과 메시지 받기
HandleActivityMessage 함수로 FileDialog Activity의 결과를 받아 오도록 등록
FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage
(TMessageResultNotification, HandleActivityMessage);
결과 처리
filename := JStringToString(Data.getStringExtra(StringToJString('RESULT_PATH')));
Edit1.Text := filename;
델파이 전체소스
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,
Androidapi.JNI.Interfaces, System.Messaging,
FMX.Platform.Android,
Androidapi.Helpers, Androidapi.JNI.App, Androidapi.JNI.GraphicsContentViewText;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
const ScanRequestCode = 0;
var FMessageSubscriptionID: Integer;
procedure HandleActivityMessage(const Sender: TObject; const M: TMessage);
function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage);
begin
if M is TMessageResultNotification then
OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode,
TMessageResultNotification(M).Value);
end;
function TForm1.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean;
var
filename : string;
begin
Result := False;
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, FMessageSubscriptionID);
FMessageSubscriptionID := 0;
// For more info see https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
if RequestCode = ScanRequestCode then
begin
if ResultCode = TJActivity.JavaClass.RESULT_OK then
begin
if Assigned(Data) then
begin
filename := JStringToString(Data.getStringExtra(StringToJString('RESULT_PATH')));
Edit1.Text := filename;
//Toast(Format('Found %s format barcode:'#10'%s', [ScanFormat, ScanContent]), LongToast);
end;
end
else if ResultCode = TJActivity.JavaClass.RESULT_CANCELED then
begin
//Toast('You cancelled the scan', ShortToast);
end;
Result := True;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Intent: JIntent; // JFileDialog;
begin
FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage
(TMessageResultNotification, HandleActivityMessage);
Intent := TJIntent.JavaClass.init;
Intent.setClassName(SharedActivityContext, StringToJString('com.lamerman.FileDialog'));
SharedActivity.startActivityForResult(Intent, 0);
end;
end.
실행


전체소스
FileExplorer.zip