Android在线更新 远程安装程序


第一步:使用java.net的URLConnection对象来创建连接

第二步:通过InputStream将下载的文件写入存储卡内缓存

第三步:下载完毕之后,通过自定义的openFile()方法打开文件,判断文件类型,若为APK,开始安装

第四步:准备离开Installer程序的同时,通过自制的delFile()方法,删除缓存内文件

  1. /** 
  2.  * 远程下载安装Android程序 
  3.  *  
  4.  * @ClassName InstallOnlineActivity 
  5.  * @author Jet 
  6.  * @date 2012-9-14 
  7.  */  
  8. public class InstallOnlineActivity extends Activity {  
  9.     private TextView mTextView;  
  10.     private EditText mEditText;  
  11.     private Button mButton;  
  12.     private String currentFilePath = "";  
  13.     private String currentTempFilePath = "";  
  14.     private String strURL = "";  
  15.     private String fileEx = "";  
  16.     private String fileName = "";  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.installonline);  
  22.         mTextView = (TextView) findViewById(R.id.installonline_text1);  
  23.         mEditText = (EditText) findViewById(R.id.installonline_edittext1);  
  24.         mButton = (Button) findViewById(R.id.installonline_button1);  
  25.         mButton.setOnClickListener(new OnClickListener() {  
  26.   
  27.             @Override  
  28.             public void onClick(View v) {  
  29.                 // 将文件下载到本地   
  30.                 mTextView.setText("下载中...");  
  31.                 strURL = mEditText.getText().toString();  
  32.                 // 截取文件后缀   
  33.                 fileEx = strURL.substring(strURL.lastIndexOf('.') + 1,  
  34.                         strURL.length()).toLowerCase();  
  35.                 // 截取文件名   
  36.                 fileName = strURL.substring(strURL.lastIndexOf('/') + 1,  
  37.                         strURL.lastIndexOf('.'));  
  38.                 getFile(strURL);  
  39.             }  
  40.   
  41.         });  
  42.     }  
  43.   
  44.     private void getFile(final String strPath) {  
  45.         if (currentFilePath.equals(strPath)) {  
  46.             getDataSource(strPath);  
  47.         }  
  48.         currentFilePath = strPath;  
  49.         Runnable r = new Runnable() {  
  50.   
  51.             @Override  
  52.             public void run() {  
  53.                 getDataSource(strPath);  
  54.             }  
  55.         };  
  56.         new Thread(r).start();  
  57.     }  
  58.   
  59.     private void getDataSource(String url) {  
  60.         if (!URLUtil.isNetworkUrl(url)) {  
  61.             mTextView.setText("请填写正确的URL");  
  62.         } else {  
  63.             try {  
  64.                 URL myUrl = new URL(url);  
  65.                 // 取得连接   
  66.                 URLConnection conn = myUrl.openConnection();  
  67.                 // 连接   
  68.                 conn.connect();  
  69.                 // 获得输入流   
  70.                 InputStream is = conn.getInputStream();  
  71.                 if (is == null) {  
  72.                     throw new RuntimeException("stream is null");  
  73.                 }  
  74.                 // 创建临时文件   
  75.                 File myTempFile = File.createTempFile(fileName, "." + fileEx);  
  76.                 // 取得临时文件存放路径   
  77.                 currentTempFilePath = myTempFile.getAbsolutePath();  
  78.                 FileOutputStream fos = new FileOutputStream(myTempFile);  
  79.                 byte[] buf = new byte[128];  
  80.                 do {  
  81.                     // 返回现在所读缓冲区的大小   
  82.                     int numread = is.read(buf);  
  83.                     if (numread <= 0) {  
  84.                         break;  
  85.                     }  
  86.                     fos.write(buf, 0, numread);  
  87.                 } while (true);  
  88.                 // 打开文件进行安装   
  89.                 openFile(myTempFile);  
  90.                 is.close();  
  91.             } catch (MalformedURLException e) {  
  92.                 e.printStackTrace();  
  93.             } catch (IOException e) {  
  94.                 e.printStackTrace();  
  95.             }  
  96.         }  
  97.     }  
  98.   
  99.     private void openFile(File file) {  
  100.         Intent intent = new Intent();  
  101.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  102.         intent.setAction(android.content.Intent.ACTION_VIEW);  
  103.         String type = getMimeType(file);  
  104.         intent.setDataAndType(Uri.fromFile(file), type);  
  105.         startActivity(intent);  
  106.     }  
  107.   
  108.     private String getMimeType(File file) {  
  109.         String type = "";  
  110.         String fname = file.getName();  
  111.         // 获得扩展名   
  112.         String end = fname  
  113.                 .substring(fname.lastIndexOf('.') + 1, fname.length())  
  114.                 .toLowerCase();  
  115.         // 按扩展名的类型决定MimeType   
  116.         if ("m4a".equals(end) || "mp3".equals(end) || "mid".equals(end)  
  117.                 || "xmf".equals(end) || "ogg".equals(end) || "wav".equals(end)) {  
  118.             type = "audio";  
  119.         } else if ("3gp".equals(end) || "mp4".equals(end)) {  
  120.             type = "video";  
  121.         } else if ("jpg".equals(end) || "gif".equals(end) || "png".equals(end)  
  122.                 || "jpeg".equals(end) || "bmp".equals(end)) {  
  123.             type = "image";  
  124.         } else if ("apk".equals(end)) {  
  125.             type = "application/vnd.android.package-archive";  
  126.         } else {  
  127.             type = "*";  
  128.         }  
  129.         if ("apk".equals(end)) {  
  130.   
  131.         } else {  
  132.             type += "/*";  
  133.         }  
  134.         return type;  
  135.     }  
  136.     private void delFile(String fileName){  
  137.         File file = new File(fileName);  
  138.         if(file.exists()){  
  139.             file.delete();  
  140.         }  
  141.     }  
  142.     @Override  
  143.     protected void onPause() {  
  144.         mTextView = (TextView) findViewById(R.id.installonline_text1);  
  145.         mTextView.setText("下载成功");  
  146.         super.onPause();  
  147.     }  
  148.     @Override  
  149.     protected void onResume() {  
  150.         //删除临时文件   
  151.         delFile(currentTempFilePath);  
  152.         super.onResume();  
  153.     }  
  154. }  

相关内容