原文:http://blog.csdn.net/jasper_success/article/details/7984065
第一步:使用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();} }