第一步:使用java.net的URLConnection對象來建立串連
第二步:通過InputStream將下載的檔案寫入儲存卡內緩衝
第三步:下載完畢之後,通過自訂的openFile()方法開啟檔案,判斷檔案類型,若為APK,開始安裝
第四步:準備離開Installer程式的同時,通過自製的delFile()方法,刪除緩衝內檔案
/** * 遠程下載安裝Android程式 * * @ClassName InstallOnlineActivity * @author Jet * @date 2012-9-14 */public class InstallOnlineActivity extends Activity {private TextView mTextView;private EditText mEditText;private Button mButton;private String currentFilePath = "";private String currentTempFilePath = "";private String strURL = "";private String fileEx = "";private String fileName = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.installonline);mTextView = (TextView) findViewById(R.id.installonline_text1);mEditText = (EditText) findViewById(R.id.installonline_edittext1);mButton = (Button) findViewById(R.id.installonline_button1);mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 將檔案下載到本地mTextView.setText("下載中...");strURL = mEditText.getText().toString();// 截取檔案尾碼fileEx = strURL.substring(strURL.lastIndexOf('.') + 1,strURL.length()).toLowerCase();// 截取檔案名稱fileName = strURL.substring(strURL.lastIndexOf('/') + 1,strURL.lastIndexOf('.'));getFile(strURL);}});}private void getFile(final String strPath) {if (currentFilePath.equals(strPath)) {getDataSource(strPath);}currentFilePath = strPath;Runnable r = new Runnable() {@Overridepublic void run() {getDataSource(strPath);}};new Thread(r).start();}private void getDataSource(String url) {if (!URLUtil.isNetworkUrl(url)) {mTextView.setText("請填寫正確的URL");} else {try {URL myUrl = new URL(url);// 取得串連URLConnection conn = myUrl.openConnection();// 串連conn.connect();// 獲得輸入資料流InputStream is = conn.getInputStream();if (is == null) {throw new RuntimeException("stream is null");}// 建立臨時檔案File myTempFile = File.createTempFile(fileName, "." + 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);// 開啟檔案進行安裝openFile(myTempFile);is.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}private void openFile(File file) {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);String type = getMimeType(file);intent.setDataAndType(Uri.fromFile(file), type);startActivity(intent);}private String getMimeType(File file) {String type = "";String fname = file.getName();// 獲得副檔名String end = fname.substring(fname.lastIndexOf('.') + 1, fname.length()).toLowerCase();// 按副檔名的類型決定MimeTypeif ("m4a".equals(end) || "mp3".equals(end) || "mid".equals(end)|| "xmf".equals(end) || "ogg".equals(end) || "wav".equals(end)) {type = "audio";} else if ("3gp".equals(end) || "mp4".equals(end)) {type = "video";} else if ("jpg".equals(end) || "gif".equals(end) || "png".equals(end)|| "jpeg".equals(end) || "bmp".equals(end)) {type = "image";} else if ("apk".equals(end)) {type = "application/vnd.android.package-archive";} else {type = "*";}if ("apk".equals(end)) {} else {type += "/*";}return type;}private void delFile(String fileName){File file = new File(fileName);if(file.exists()){file.delete();}}@Overrideprotected void onPause() {mTextView = (TextView) findViewById(R.id.installonline_text1);mTextView.setText("下載成功");super.onPause();}@Overrideprotected void onResume() {//刪除臨時檔案delFile(currentTempFilePath);super.onResume();}}