자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey FMX앱에서 던진 Intent를 Google Apps가 Intent를 받지 못합니다.
2017.11.14 17:57
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
안드로이드에서 shellexcute처럼 파일을 열었을 때
Intent사용해서 외부 실행가능한 앱들을 연결할 수 있게끔 해주려고 합니다.
테스트해보니까 잘 되는 것 같은데 xlsx, ppt, pdf 확장자에 대해서
기본 구글앱스(스프레트시트, 프레젠테이션, 드라이브 PDF 뷰어)들이 받지를 못합니다.
이미지 파일에 대해서 구글앱스 중에 포토, 갤러리는 문제없이 잘 받습니다.
그래서 미메타입을 얻었는데 연결될 앱이 하나도 없으면 아래와 같은 Exception을 뱉어냅니다. 예외처리는 하면 되지만,
미메타입을 */*로 해도 구글앱스(스프레트시트, 프레젠테이션, 드라이브 PDF 뷰어)들이 선택 목록에 없습니다.
이것때문에 기본 구글앱스가 있는데 사용자에게 서드파티앱을 설치하도록 강제하는 것도 그렇고
제가 무엇을 조치하면 구글앱스가 Intent를 받을까요?
제 디바이스에서 ES 파일 탐색기로 해당 확장자 파일 열어보면 해당 구글앱스들이 잘 나옵니다.
증상은 제 디바이스와 에뮬레이터 둘 다 테스트해도 똑같습니다.
아래는 제가 테스트해본 예제소스는입니다.
uses
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
Androidapi.Helpers,
System.IOUtils,
Androidapi.JNI.Webkit;
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
var
Intent: JIntent;
filename: String;
t: JString;
begin
filename := Edit1.text;
Intent := TJIntent.Create;
// Get MIME Type
t := TJMimeTypeMap.JavaClass.getSingleton.getMimeTypeFromExtension
(StringToJString (StringReplace (TPath.GetExtension(filename), '.', '', [])));
if t = nil then
t := StringToJString('*/*');
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setDataAndType(StrToJURI(TPath.GetPublicPath + PathDelim + filename), t);
SharedActivity.startActivity(Intent);
end;
Firemonkey FMX앱에서 던진 Intent를 Google Apps가 Intent를 받지 못합니다.
2017.11.14 17:57
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
안드로이드에서 shellexcute처럼 파일을 열었을 때
Intent사용해서 외부 실행가능한 앱들을 연결할 수 있게끔 해주려고 합니다.
테스트해보니까 잘 되는 것 같은데 xlsx, ppt, pdf 확장자에 대해서
기본 구글앱스(스프레트시트, 프레젠테이션, 드라이브 PDF 뷰어)들이 받지를 못합니다.
이미지 파일에 대해서 구글앱스 중에 포토, 갤러리는 문제없이 잘 받습니다.
그래서 미메타입을 얻었는데 연결될 앱이 하나도 없으면 아래와 같은 Exception을 뱉어냅니다. 예외처리는 하면 되지만,
미메타입을 */*로 해도 구글앱스(스프레트시트, 프레젠테이션, 드라이브 PDF 뷰어)들이 선택 목록에 없습니다.
이것때문에 기본 구글앱스가 있는데 사용자에게 서드파티앱을 설치하도록 강제하는 것도 그렇고
제가 무엇을 조치하면 구글앱스가 Intent를 받을까요?
제 디바이스에서 ES 파일 탐색기로 해당 확장자 파일 열어보면 해당 구글앱스들이 잘 나옵니다.
증상은 제 디바이스와 에뮬레이터 둘 다 테스트해도 똑같습니다.
아래는 제가 테스트해본 예제소스는입니다.
uses
Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNI.JavaTypes,
Androidapi.Helpers,
System.IOUtils,
Androidapi.JNI.Webkit;
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
var
Intent: JIntent;
filename: String;
t: JString;
begin
filename := Edit1.text;
Intent := TJIntent.Create;
// Get MIME Type
t := TJMimeTypeMap.JavaClass.getSingleton.getMimeTypeFromExtension
(StringToJString (StringReplace (TPath.GetExtension(filename), '.', '', [])));
if t = nil then
t := StringToJString('*/*');
Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
Intent.setDataAndType(StrToJURI(TPath.GetPublicPath + PathDelim + filename), t);
SharedActivity.startActivity(Intent);
end;
몇가지 테스트 해보니 ACTION_VIEW로 파일을 여는 경우 URI는 "file:///"로 시작해야 하네요.
JFile로 파일을 읽어 URI를 가져오도록 구현했습니다.
PDF 파일을 연결해 기본 브라우저로 표시되는 것을 확인했고,
XLSX 파일의 경우 기본 앱이 없어 구글 플레이스토어에서 스프레드시트와 MS엑셀 설치하니 여러개가 표시되네요.
var
Path, Filename, FileExt: String;
MimeType: JString;
LFile: JFile;
FileUri: JNet_Uri;
ViewIntent, OpenIntent: JIntent;
begin
Filename := Edit1.text;
// Get MIME Type
FileExt := StringReplace(TPath.GetExtension(Filename), '.', '', []);
MimeType := TJMimeTypeMap.JavaClass.getSingleton.getMimeTypeFromExtension(StringToJString (FileExt));
if MimeType = nil then
MimeType := StringToJString('*/*');
Path := TPath.GetPublicPath + PathDelim + Filename;
LFile := TJFile.JavaClass.init(StringToJString(Path));
FileUri := TJnet_Uri.JavaClass.fromFile(LFile);
// ShowMessage(JURIToStr(FileUri));
ViewIntent := TJIntent.Create;
OpenIntent := TJIntent.Create;
ViewIntent.setAction(TJIntent.JavaClass.ACTION_VIEW);
ViewIntent.setDataAndType(FileUri, MimeType);
if MainActivity.getPackageManager.queryIntentActivities(ViewIntent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size > 0 then
SharedActivity.startActivity(ViewIntent)
else
ShowMessage(Format('''%s'' 확장자와 연결된 프로그램을 찾을 수 없습니다.', [FileExt]));
end;