Android實(shí)現(xiàn)簡(jiǎn)單的文件下載與上傳
文件下載
/** * 下載服務(wù) IntentService * 生命周期: * 1>當(dāng)?shù)谝淮螁?dòng)IntentService時(shí),Android容器 * 將會(huì)創(chuàng)建IntentService對(duì)象。 * 2>IntentService將會(huì)在工作線程中輪循消息隊(duì)列, * 執(zhí)行每個(gè)消息對(duì)象中的業(yè)務(wù)邏輯。 * 3>如果消息隊(duì)列中依然有消息,則繼續(xù)執(zhí)行, * 如果消息隊(duì)列中的消息已經(jīng)執(zhí)行完畢, * IntentService將會(huì)自動(dòng)銷(xiāo)毀,執(zhí)行onDestroy方法。 */ public class DownloadService extends IntentService{ private static final int NOTIFICATION_ID = 100; public DownloadService(){ super("download"); } public DownloadService(String name) { super(name); } /** * 該方法中的代碼將會(huì)在工作線程中執(zhí)行 * 每當(dāng)調(diào)用startService啟動(dòng)IntentService后, * IntentService將會(huì)把OnHandlerIntent中的 * 業(yè)務(wù)邏輯放入消息隊(duì)列等待執(zhí)行。 * 當(dāng)工作線程輪循到該消息對(duì)象時(shí),將會(huì) * 執(zhí)行該方法。 */ protected void onHandleIntent(Intent intent) { //發(fā)送Http請(qǐng)求 執(zhí)行下載業(yè)務(wù) //1. 獲取音樂(lè)的路徑 String url=intent.getStringExtra("url"); String bit=intent.getStringExtra("bit"); String title=intent.getStringExtra("title"); //2. 構(gòu)建File對(duì)象,用于保存音樂(lè)文件 // /mnt/sdcard/Music/_64/歌名.mp3 File targetFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC),"_"+bit+"/"+title+".mp3" ); if(targetFile.exists()){ Log.i("info", "音樂(lè)已存在"); return; } if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } try { sendNotification("音樂(lè)開(kāi)始下載", "音樂(lè)開(kāi)始下載"); //3. 發(fā)送Http請(qǐng)求,獲取InputStream InputStream is = HttpUtils.getInputStream(url); //4. 邊讀取邊保存到File對(duì)象中 FileOutputStream fos = new FileOutputStream(targetFile); byte[] buffer = new byte[1024*100]; int length=0; int current = 0; int total = Integer.parseInt(intent.getStringExtra("total")); while((length=is.read(buffer)) != -1){ fos.write(buffer, 0, length); fos.flush(); current += length; //通知下載的進(jìn)度 double progress = Math.floor(1000.0*current/total)/10; sendNotification("音樂(lè)開(kāi)始下載", "下載進(jìn)度:"+progress+"%"); } //5. 文件下載完成 fos.close(); cancelNotification(); //重新出現(xiàn)滾動(dòng)消息 sendNotification("音樂(lè)下載完成", "音樂(lè)下載完畢"); } catch (Exception e) { e.printStackTrace(); } } /** * 發(fā)通知 */ public void sendNotification(String ticker, String text){ NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.ic_launcher) .setContentTitle("音樂(lè)下載") .setContentText(text) .setTicker(ticker); Notification n = builder.build(); manager.notify(NOTIFICATION_ID, n); } /** * 取消通知 */ public void cancelNotification(){ NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(NOTIFICATION_ID); } }
文件上傳
/** * 上傳文件 * @param uploadFile */ private void uploadFile(final File uploadFile) { new Thread(new Runnable() { @Override public void run() { try { uploadbar.setMax((int)uploadFile.length()); String souceid = logService.getBindId(uploadFile); String head = "Content-Length="+ uploadFile.length() + ";filename="+ uploadFile.getName() + ";sourceid="+ (souceid==null? "" : souceid)+"\r\n"; Socket socket = new Socket("192.168.1.78",7878); OutputStream outStream = socket.getOutputStream(); outStream.write(head.getBytes()); PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream()); String response = StreamTool.readLine(inStream); String[] items = response.split(";"); String responseid = items[0].substring(items[0].indexOf("=")+1); String position = items[1].substring(items[1].indexOf("=")+1); if(souceid==null){//代表原來(lái)沒(méi)有上傳過(guò)此文件,往數(shù)據(jù)庫(kù)添加一條綁定記錄 logService.save(responseid, uploadFile); } RandomAccessFile fileOutStream = new RandomAccessFile(uploadFile, "r"); fileOutStream.seek(Integer.valueOf(position)); byte[] buffer = new byte[1024]; int len = -1; int length = Integer.valueOf(position); while(start&&(len = fileOutStream.read(buffer)) != -1){ outStream.write(buffer, 0, len); length += len; Message msg = new Message(); msg.getData().putInt("size", length); handler.sendMessage(msg); } fileOutStream.close(); outStream.close(); inStream.close(); socket.close(); if(length==uploadFile.length()) logService.delete(uploadFile); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Android 使用Vitamio打造自己的萬(wàn)能播放器(9)—— 在線播放 (在線電視)
本文主要介紹Android 使用Vitamio開(kāi)發(fā)播放器,實(shí)現(xiàn)在線電視播放,這里提供效果圖和實(shí)例代碼以便大家參考,2016-07-07一文帶你徹底搞懂Behavior實(shí)現(xiàn)復(fù)雜的視覺(jué)聯(lián)動(dòng)效果原理
這篇文章主要為大家介紹了一文帶你徹底搞懂Behavior實(shí)現(xiàn)復(fù)雜的視覺(jué)聯(lián)動(dòng)效果原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Android RecyclerView的Item點(diǎn)擊事件實(shí)現(xiàn)整理
這篇文章主要介紹了Android RecyclerView的Item點(diǎn)擊事件實(shí)現(xiàn)整理的相關(guān)資料,需要的朋友可以參考下2017-01-01Kotlin?掛起函數(shù)CPS轉(zhuǎn)換原理解析
這篇文章主要為大家介紹了Kotlin?掛起函數(shù)CPS轉(zhuǎn)換原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android編程實(shí)現(xiàn)帶有圖標(biāo)的ListView并帶有長(zhǎng)按菜單效果示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)帶有圖標(biāo)的ListView并帶有長(zhǎng)按菜單效果,結(jié)合實(shí)例形式分析了Android帶圖標(biāo)的ListView及菜單功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06Android仿新浪微博自定義ListView下拉刷新(4)
這篇文章主要為大家詳細(xì)介紹了Android仿新浪微博自定義ListView下拉刷新,重點(diǎn)介紹了Adapter的詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11使用adb?or?fastboot命令進(jìn)入高通的9008(edl)模式的兩種方法
這篇文章主要介紹了使用adb?or?fastboot命令進(jìn)入高通的9008(edl)模式,兩種方式通過(guò)命令給大家寫(xiě)的非常詳細(xì),文中又給大家補(bǔ)充介紹了高通手機(jī)?進(jìn)入?高通9008模式的兩種方法,需要的朋友可以參考下2023-01-01