2013년 3월 21일 목요일

Android에서 PhoneGap을 이용한 첨부파일 다운로드 및 열기


Android와 PhoneGap을 이용하여 Web상에 존재하는 첨부파일을 다운로드하고 이를 Phone에 설치된 App으로 여는 예제를 설명하도록 하겠습니다.

본 예제에서 사용된 PhoneGap 버전은 2.5 입니다.

아래와 같이 "첨부"에 링크를 걸게 됩니다.

<a href='javascript:getFileDownload("http://i3.kym-cdn.com/entries/icons/original/000/000/080/doubt.jpg”);''><img src='../images/ico_att.gif' style='vertical-align: top;'>첨부</a>

function getFileDownload() {
fileDownload(remoteFile, onCallback);
}

function onCallback(entry) {  → 파일다운로드가 완료되면 호출되는 CallBack Method
cordova.exec(
function(result) {
}, function(error) {
console.log("Error: "+e);
}, "UrikidsPlugIn", "showFile", [entry.fullPath]);
}



PhoneGap의 FileTransper.Download API을 이용한 ‘getFileDownload' JavaScript은 아래와 같습니다.


var localFilePath = "Hurukku/";
...
function fileDownload(remoteFile, callback) {
   var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
   window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
       fileSystem.root.getFile("dummy.html", {create: true, exclusive: false}, function(fileEntry) {
           var localPath = fileEntry.fullPath;
           
           if (device.platform === "Android" && localPath.indexOf("file://") === 0) {
               localPath = localPath.substring(7);
           }
           
           localPath = localPath.replace("dummy.html",localFilePath+localFileName);
           window.dialog.showDialog();
           var ft = new FileTransfer();
           ft.download(
            encodeURI(remoteFile),
               localPath,
               function(entry) {
            window.dialog.dismissDialog();
       console.log("download complete: " + entry.fullPath);
       if(callback != null) {
       callback(entry);        
       }
   },
   function(error) {
       window.dialog.dismissDialog();
       console.log("download error source " + error.source);
       console.log("download error target " + error.target);
       console.log("upload error code" + error.code);
   }
           );
       }, fail);
   }, fail);
}


  • localFilePath: 파일이 다운로드 될 위치로 안드로이드 경우 기본적으로 "storage/sdcard”영역 아래로 지정된다.
  • remoteFile: 첨부 파일의 Web상 위치
  • callback: 첨부 파일 다운로드 완료후 호출될 JavaScript Method
  • dummy.html: localStorage Path을 찾기위해 사용되는 임미의 파일 이름으로, localFileName으로 변환 됨.


첨부파일을 Phone에 설치된 App으로 열기위해서 PhoneGap의 Custom Plugin에 "showfile" 메서드를 만들고 callback 메서드에서 호출하게 한다.


public void showFile(String filePath) {
Log.d(this.getClass().getSimpleName(), filePath);
filePath = filePath.substring(7);
Log.d(this.getClass().getSimpleName(), filePath);
File file = new File(filePath);
if (file.exists()) {
MimeTypeMap mtm = MimeTypeMap.getSingleton();
String fileExtension = filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length()).toLowerCase();
String mimeType = mtm.getMimeTypeFromExtension(fileExtension);

if (mimeType != null) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), mimeType);
try {
MainActivity.thisActivity.startActivity(intent);
} catch (ActivityNotFoundException ane) { → 지원하지 않는 파일 형식일경우.
     …
}
} else { → mimeType을 가져오지 못할 경우.
}
} else { → 현재 위치에 파일이 없는 경우.
}
}


댓글 1개:

  1. 소스좀 받을 수 있을까요??
    phonegap 3.5에서 하는데 잘 안되네요..;;

    답글삭제

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...