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

 

댓글을 달아 주세요

  1. Humphery 2014.11.21 10:23  댓글주소  수정/삭제  댓글쓰기

    파란싼타님 제 블로그에 퍼가겠습니다. 좋은 글 감사해요^^

  2. 희아 2016.07.14 17:24  댓글주소  수정/삭제  댓글쓰기

    jar 만들어주신걸로 하면 잘되는데 원래소스로 jar 를 만들어하면 안됩니다. jar 를 만들 때 어떻게하는지요?

    source 를 build 하고
    java source 2개만 선택해서 export -> jar file 만들고
    java2op 해서 res 추가하고 파일을 하면 버튼눌렀을 때 죽어버립니다.
    원래 delphi 있는 source 에서 jar 바꼬고 java2op 만 반복해보고 있습니다. jar 를 만들때에 소스말고 추가해야하는게 있는지 알고싶습니다.

  3. alteisen 2017.07.07 18:47  댓글주소  수정/삭제  댓글쓰기

    your project worked but when i tried to rebuild the jar file (from the FileExplorer project in the link), the application crashed when i pressed the button.

    So the question is how did you create the jar file? I've tried it using Eclipse, Android Studio, and command line. None of the jar files worked.

  4. 2017.08.24 22:41  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  5. 2018.05.22 01:58  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  6. Coldz 2019.02.12 02:19  댓글주소  수정/삭제  댓글쓰기

    its not working in android 8 _ FileExplorer has stopped working..