Android實現(xiàn)簡單的文件下載與上傳
文件下載
/**
* 下載服務(wù) IntentService
* 生命周期:
* 1>當(dāng)?shù)谝淮螁覫ntentService時,Android容器
* 將會創(chuàng)建IntentService對象。
* 2>IntentService將會在工作線程中輪循消息隊列,
* 執(zhí)行每個消息對象中的業(yè)務(wù)邏輯。
* 3>如果消息隊列中依然有消息,則繼續(xù)執(zhí)行,
* 如果消息隊列中的消息已經(jīng)執(zhí)行完畢,
* IntentService將會自動銷毀,執(zhí)行onDestroy方法。
*/
public class DownloadService extends IntentService{
private static final int NOTIFICATION_ID = 100;
public DownloadService(){
super("download");
}
public DownloadService(String name) {
super(name);
}
/**
* 該方法中的代碼將會在工作線程中執(zhí)行
* 每當(dāng)調(diào)用startService啟動IntentService后,
* IntentService將會把OnHandlerIntent中的
* 業(yè)務(wù)邏輯放入消息隊列等待執(zhí)行。
* 當(dāng)工作線程輪循到該消息對象時,將會
* 執(zhí)行該方法。
*/
protected void onHandleIntent(Intent intent) {
//發(fā)送Http請求 執(zhí)行下載業(yè)務(wù)
//1. 獲取音樂的路徑
String url=intent.getStringExtra("url");
String bit=intent.getStringExtra("bit");
String title=intent.getStringExtra("title");
//2. 構(gòu)建File對象,用于保存音樂文件
// /mnt/sdcard/Music/_64/歌名.mp3
File targetFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC),"_"+bit+"/"+title+".mp3" );
if(targetFile.exists()){
Log.i("info", "音樂已存在");
return;
}
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdirs();
}
try {
sendNotification("音樂開始下載", "音樂開始下載");
//3. 發(fā)送Http請求,獲取InputStream
InputStream is = HttpUtils.getInputStream(url);
//4. 邊讀取邊保存到File對象中
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;
//通知下載的進度
double progress = Math.floor(1000.0*current/total)/10;
sendNotification("音樂開始下載", "下載進度:"+progress+"%");
}
//5. 文件下載完成
fos.close();
cancelNotification(); //重新出現(xiàn)滾動消息
sendNotification("音樂下載完成", "音樂下載完畢");
} 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("音樂下載")
.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){//代表原來沒有上傳過此文件,往數(shù)據(jù)庫添加一條綁定記錄
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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Android 使用Vitamio打造自己的萬能播放器(9)—— 在線播放 (在線電視)
本文主要介紹Android 使用Vitamio開發(fā)播放器,實現(xiàn)在線電視播放,這里提供效果圖和實例代碼以便大家參考,2016-07-07
一文帶你徹底搞懂Behavior實現(xiàn)復(fù)雜的視覺聯(lián)動效果原理
這篇文章主要為大家介紹了一文帶你徹底搞懂Behavior實現(xiàn)復(fù)雜的視覺聯(lián)動效果原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
Android RecyclerView的Item點擊事件實現(xiàn)整理
這篇文章主要介紹了Android RecyclerView的Item點擊事件實現(xiàn)整理的相關(guān)資料,需要的朋友可以參考下2017-01-01
Kotlin?掛起函數(shù)CPS轉(zhuǎn)換原理解析
這篇文章主要為大家介紹了Kotlin?掛起函數(shù)CPS轉(zhuǎn)換原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Android編程實現(xiàn)帶有圖標(biāo)的ListView并帶有長按菜單效果示例
這篇文章主要介紹了Android編程實現(xiàn)帶有圖標(biāo)的ListView并帶有長按菜單效果,結(jié)合實例形式分析了Android帶圖標(biāo)的ListView及菜單功能相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-06-06
Android仿新浪微博自定義ListView下拉刷新(4)
這篇文章主要為大家詳細介紹了Android仿新浪微博自定義ListView下拉刷新,重點介紹了Adapter的詳細代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
使用adb?or?fastboot命令進入高通的9008(edl)模式的兩種方法
這篇文章主要介紹了使用adb?or?fastboot命令進入高通的9008(edl)模式,兩種方式通過命令給大家寫的非常詳細,文中又給大家補充介紹了高通手機?進入?高通9008模式的兩種方法,需要的朋友可以參考下2023-01-01

