Android實(shí)現(xiàn)下載文件功能的方法
本文所述為Android實(shí)現(xiàn)下載文件功能的完整示例代碼,對(duì)于學(xué)習(xí)和研究android編程相信會(huì)有一定的幫助,尤其是對(duì)Android初學(xué)者有一定的借鑒價(jià)值。
完整功能代碼如下:
package com.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Main extends Activity {
private TextView mTextView01;
private EditText mEditText01;
private Button mButton01;
private static final String TAG = "DOWNLOADAPK";
private String currentFilePath = "";
private String currentTempFilePath = "";
private String strURL="";
private String fileEx="";
private String fileNa="";
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView01 = (TextView)findViewById(R.id.myTextView1);
mButton01 = (Button)findViewById(R.id.myButton1);
mEditText01 =(EditText)findViewById(R.id.myEditText1);
mButton01.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
// 文件會(huì)下載至local端
mTextView01.setText("下載中...");
strURL = mEditText01.getText().toString();
/*取得欲安裝程序之文件名稱*/
fileEx = strURL.substring(strURL.lastIndexOf(".")
+1,strURL.length()).toLowerCase();
fileNa = strURL.substring(strURL.lastIndexOf("/")
+1,strURL.lastIndexOf("."));
getFile(strURL);
}
}
);
mEditText01.setOnClickListener(new EditText.OnClickListener()
{
public void onClick(View arg0){
mEditText01.setText("");
mTextView01.setText("遠(yuǎn)程安裝程序(請(qǐng)輸入U(xiǎn)RL)");
}
});
}
/* 處理下載URL文件自定義函數(shù) */
private void getFile(final String strPath) {
try
{
if (strPath.equals(currentFilePath) )
{
getDataSource(strPath);
}
currentFilePath = strPath;
Runnable r = new Runnable()
{
public void run()
{
try
{
getDataSource(strPath);
}
catch (Exception e)
{
Log.e(TAG, e.getMessage(), e);
}
}
};
new Thread(r).start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/*取得遠(yuǎn)程文件*/
private void getDataSource(String strPath) throws Exception
{
if (!URLUtil.isNetworkUrl(strPath))
{
mTextView01.setText("錯(cuò)誤的URL");
}
else
{
/*取得URL*/
URL myURL = new URL(strPath);
/*創(chuàng)建連接*/
URLConnection conn = myURL.openConnection();
conn.connect();
/*InputStream 下載文件*/
InputStream is = conn.getInputStream();
if (is == null)
{
throw new RuntimeException("stream is null");
}
/*創(chuàng)建臨時(shí)文件*/
File myTempFile = File.createTempFile(fileNa, "."+fileEx);
/*取得站存盤案路徑*/
currentTempFilePath = myTempFile.getAbsolutePath();
/*將文件寫入暫存盤*/
FileOutputStream fos = new FileOutputStream(myTempFile);
byte buf[] = new byte[128];
do
{
int numread = is.read(buf);
if (numread <= 0)
{
break;
}
fos.write(buf, 0, numread);
}while (true);
/*打開文件進(jìn)行安裝*/
openFile(myTempFile);
try
{
is.close();
}
catch (Exception ex)
{
Log.e(TAG, "error: " + ex.getMessage(), ex);
}
}
}
/* 在手機(jī)上打開文件的method */
private void openFile(File f)
{
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
/* 調(diào)用getMIMEType()來取得MimeType */
String type = getMIMEType(f);
/* 設(shè)置intent的file與MimeType */
intent.setDataAndType(Uri.fromFile(f),type);
startActivity(intent);
}
/* 判斷文件MimeType的method */
private String getMIMEType(File f)
{
String type="";
String fName=f.getName();
/* 取得擴(kuò)展名 */
String end=fName.substring(fName.lastIndexOf(".")
+1,fName.length()).toLowerCase();
/* 依擴(kuò)展名的類型決定MimeType */
if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")||
end.equals("xmf")||end.equals("ogg")||end.equals("wav"))
{
type = "audio";
}
else if(end.equals("3gp")||end.equals("mp4"))
{
type = "video";
}
else if(end.equals("jpg")||end.equals("gif")||end.equals("png")||
end.equals("jpeg")||end.equals("bmp"))
{
type = "image";
}
else if(end.equals("apk"))
{
/* android.permission.INSTALL_PACKAGES */
type = "application/vnd.android.package-archive";
}
else
{
type="*";
}
/*如果無法直接打開,就跳出軟件列表給用戶選擇 */
if(end.equals("apk"))
{
}
else
{
type += "/*";
}
return type;
}
/*自定義刪除文件方法*/
private void delFile(String strFileName)
{
File myFile = new File(strFileName);
if(myFile.exists())
{
myFile.delete();
}
}
/*當(dāng)Activity處于onPause狀態(tài)時(shí),更改TextView文字狀態(tài)*/
protected void onPause()
{
mTextView01 = (TextView)findViewById(R.id.myTextView1);
mTextView01.setText("下載成功");
super.onPause();
}
/*當(dāng)Activity處于onResume狀態(tài)時(shí),刪除臨時(shí)文件*/
protected void onResume()
{
/* 刪除臨時(shí)文件 */
delFile(currentTempFilePath);
super.onResume();
}
}
讀者可以在該實(shí)例的基礎(chǔ)上進(jìn)行修改與完善,使之更符合自身項(xiàng)目需求。
- Android 下載文件通知欄顯示進(jìn)度條功能的實(shí)例代碼
- Android中使用AsyncTask實(shí)現(xiàn)下載文件動(dòng)態(tài)更新進(jìn)度條功能
- android中實(shí)現(xiàn)OkHttp下載文件并帶進(jìn)度條
- android實(shí)現(xiàn)多線程下載文件(支持暫停、取消、斷點(diǎn)續(xù)傳)
- Android實(shí)現(xiàn)Service下載文件,Notification顯示下載進(jìn)度的示例
- 使用Android系統(tǒng)提供的DownloadManager來下載文件
- Android通過SOCKET下載文件的方法
- Android實(shí)現(xiàn)多線程下載文件的方法
- Android使用Handler實(shí)現(xiàn)下載文件功能
相關(guān)文章
5個(gè)Android開發(fā)中比較常見的內(nèi)存泄漏問題及解決辦法
本文主要介紹了5個(gè)Android開發(fā)中比較常見的內(nèi)存泄漏問題及解決辦法,具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-02-02
Android 自定義TextView去除paddingTop和paddingBottom
這篇文章主要介紹了Android 自定義TextView去除paddingTop和paddingBottom的相關(guān)資料,這里提供實(shí)例來幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
Android自定義實(shí)現(xiàn)側(cè)滑菜單效果
這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android定時(shí)器和Handler用法實(shí)例分析
這篇文章主要介紹了Android定時(shí)器和Handler用法,實(shí)例分析了Android中的定時(shí)器與Handler相關(guān)使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Android入門之彈出式對(duì)話框的實(shí)現(xiàn)
Android Studio里有一種Dialog叫PopWindow,它是一種“可阻塞式Dialog”,即彈出后除非你給它一個(gè)“動(dòng)作”否則就一直顯示在那。本文就將實(shí)現(xiàn)這樣的彈出式對(duì)話框,感興趣的可以了解一下2022-11-11
Android編程實(shí)現(xiàn)抽屜效果的方法詳解
這篇文章主要介紹了Android編程實(shí)現(xiàn)抽屜效果的方法,結(jié)合具體實(shí)例形式分析了Android實(shí)現(xiàn)抽屜效果的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
Android開發(fā)之ImageSwitcher相冊(cè)功能實(shí)例分析
這篇文章主要介紹了Android開發(fā)之ImageSwitcher相冊(cè)功能,結(jié)合實(shí)例形式分析了Android ImageSwitcher相冊(cè)的原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-03-03
Android Binder進(jìn)程間通信工具AIDL使用示例深入分析
Binder作為Android 眾多的IPC通訊手段之一,在Framework的數(shù)據(jù)傳輸中起到極為關(guān)鍵的作用。Binder機(jī)制可謂是Android 知識(shí)體系里的重中之重,作為偏底層的基礎(chǔ)組件,平時(shí)我們很少關(guān)注它,而它卻是無處不在,也是Android 面試易考察的點(diǎn)之一2022-11-11

