|
학 습 문 서 |
문서 번호 |
2013-S-04 | |
작성 일자 |
2013.05.01 | ||
기술명 |
Android |
주 제 |
WebService Download |
작성자 |
황규철 |
소요 시간 |
6H |
파일 다운로드 | ||
|
|
|
내용 | ||
안드로이드 3.0 이상에서 네트워크 작업이 UIThread에 영향을 주는 것을 방지하려는 의도에서 ThreadException이 발생한다. 이를 해결하기 위해서 AsyncTask를 사용하여 네트워크 작업을 별로의 Thread에서 수행할 수 있도록 했다.
안드로이드 2.3 이상에서는 기본적으로 DownloadManager를 지원하기 때문에 이를 사용하여 파일다운로드를 할 수 있지만, 안드로이드 2.3 이하에서는 다운로드작업을 따로 만들어야 한다. | ||
문제점 | ||
파일명에 한글이 들어갈 때 파일다운로드가 되지 않는다. 한글명 파일의 인코딩 방식 때문에 일어나는 문제로 생각된다. 다운로드 경로의 인코딩 방식을 변환하면 해결될 것이다. | ||
참조사이트 | ||
http://developer.android.com/index.html - Android Developers |
안드로이드 2.3 이상에서 다운로드 |
private DownloadManager dmanager; private DownloadManager.Request drequest; private long latestId = -1; ListView lv_item;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
lv_item = (ListView)findViewById(R.id.lv_item); lv_item.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { String file_name = al_item.get(arg2).toString(); new DownloadTask().execute(file_name); } }); } private class DownloadTask extends AsyncTask<String,Void,Void>{ @Override protected Void doInBackground(String... params) { Download(params[0]); dmanager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); return null; } } protected void Download(String fname) { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.debug = true;
try { androidHttpTransport.call(SOAP_ACTION2, envelope); SoapPrimitive resultString = (SoapPrimitive)envelope.getResponse(); String uri = resultString.toString(); GetItem(uri,fname); } catch(Exception e) { } } protected void GetItem(final String uri, final String fname) { new Thread(){ public void run(){ try{ Uri upath = Uri.parse(uri+fname); List<String> pathSegments = upath.getPathSegments(); drequest = new DownloadManager.Request(upath); drequest.setTitle(fname); drequest.setDescription(uri);
drequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, pathSegments.get(pathSegments.size()-1)); Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).mkdir(); latestId = dmanager.enqueue(drequest); } catch(Exception e) { } } }.start(); } |
ListView의 항목을 선택했을 때 DownloadTask를 수행한다. DownloadTask내의 doInBackground메서드에서 백그라운드에서 수행 될 작업들을 한다. Download메서드에서 웹하드의 주소를 가져와 다운로드를 시작한다. GetItem메서드에서 DownloadManager를 통해 파일이 다운로드 된다. |
안드로이드 2.3미만에서 다운로드 |
protected void GetItem(final String uri, final String fname) { // TODO Auto-generated method stub new Thread(){ public void run(){ try{
String filePath = "/mnt/sdcard/Download/"+fname; URL url = new URL(uri+fname); HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(false); urlConnection.connect(); File file = new File(filePath); FileOutputStream fileOutput = new FileOutputStream(file); InputStream inputStream = urlConnection.getInputStream(); byte[] buf = new byte[1024]; int bufferLength = 0; while((bufferLength = inputStream.read(buf)) > 0) { fileOutput.write(buf,0,bufferLength); } fileOutput.close(); } catch(Exception e) { } }; }.start(); } |