출처 : 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

 

신고


 

티스토리 툴바