델파이로 만든 안드로이드 앱에서 외부 앱 호출하기

어쩌다보니 언젠가부터 자꾸 델파이로 앱을 만들고 있다. Android App.

그런데, Android Studio 자료는 많지만 델파이 자료는 없다보니 삽질 중인데, 어차피 안드로이드 앱이라는게 Java API를 래핑한 것이라 Android Studio 자료만 가지고서도 약간만 응용하면 델파이에서 사용할 수 있다.
외부 앱 실행을 위한 코드는 아래와 같다. 인텐트니 뭐니 다른 것 생각할 필요도 없고 그냥 실행만 시키는 코드다. 아, 실행시킬 앱이 폰에 설치되어 있지 않을 수 있으니 그것에 대한 오류 처리는 해야 한다. 그 오류 처리를 위해 VarIsNull 함수를 썼었는데 원하는 결과가 나오지 않았다.

결국 NULL 체크를 하는데 가장 유용한 try ... except 구문으로 NULL 처리를 했다.

일단 사용 유닛들은 다음과 같다. 안드로이드 앱 만들때, 사용 유닛들 정리가 귀찮아서 내가 주로 쓰는 것을 모두 uses 절에 넣어놓는다. 그러면 웬만한 에러는 나지 않는다.

 {$IFDEF ANDROID} 
 Androidapi.JNI.Os, // 권한 호출용 unit 
 Androidapi.JNI.JavaTypes, // 권한 호출용 unit 
 Androidapi.Helpers, // 권한 호출, 종료 확인용 unit 
 Androidapi.JNI.Telephony, // 전화번호 가져올때 쓰는 unit 
 Androidapi.JNIBridge, 
 Androidapi.JNI.GraphicsContentViewText, 
 FMX.Helpers.Android, 
 {$ENDIF}

그러면 패키지 이름만 가지고 다른 앱을 부를 수 있다. 아래가 그 코드다.

procedure TfrmMain.lunchApp;
var
  s : String;
  PackageManager: JPackageManager;
  Intent : JIntent;
begin
  s := 'com.chbreeze.jikbang4a'; // 폰에 존재하는 앱으로만 해야 함
  try
    Intent := TJIntent.Create;
    PackageManager := SharedActivityContext.getPackageManager;
    Intent := PackageManager.getLaunchIntentForPackage(StringToJString(s));
    Intent.setAction(TJIntent.JavaClass.ACTION_MAIN);
    SharedActivity.startActivity(Intent);
  except
    on e:Exception do
    begin
      MessageDlg('실행하려는 앱이 설치되지 않았습니다 종료하시겠습니까?', System.UITypes.TMsgDlgType.mtInformation,
        [
          System.UITypes.TMsgDlgBtn.mbYes,
          System.UITypes.TMsgDlgBtn.mbNo
          //System.UITypes.TMsgDlgBtn.mbCancel
        ], 0,
        procedure (const AResult: TModalResult)
        begin
          if AResult = mrYes then SharedActivity.finish;
        end
        );
    end;
  end;
end;

 

그런데, 저 위 코드를 실행시키기 위해서는 앱에 권한을 추가로 부여해야 한다. Query all packages 권한을 부여한다. 위험한 권한이 아니기 때문에 추가로 승인을 받을 필요도 없다. 그냥 툴에서 퍼미션 체크만 해주면 된다.

 

설정

트랙백

댓글