读书人

远程上载安装apk文件到手机或模拟器

发布时间: 2012-10-28 09:54:44 作者: rapoo

远程下载安装apk文件到手机或模拟器
废话少说,直接上代码,会加上详细注释:
测试地址:http://www.dubblogs.cc:8751/Android/Test/Apk/EX04_14.apk

package cn.com;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; /*必须引用java.io与java.net*/import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;public class InstallUrlApk 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 = "";  /** Called when the activity is first created. */  @Override  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)      {        /* 文件会下载至local端 */        mTextView01.setText("下载中...");        strURL = mEditText01.getText().toString();        /取得欲安装程序之文件名称(后缀名)        fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length())            .toLowerCase();        System.out.println("***************fileEx =" + fileEx);        fileNa = strURL.substring(strURL.lastIndexOf("/") + 1, strURL            .lastIndexOf("."));        System.out.println("***************fileNa =" + fileNa);        //开启一个子线程进行文件的下载        getFile(strURL);      }    });    mEditText01.setOnClickListener(new EditText.OnClickListener()    {      @Override      public void onClick(View arg0)      {        // TODO Auto-generated method stub        mEditText01.setText("");        mTextView01.setText("远程安装程序(请输入URL)");      }    });  }  /* 处理下载URL文件自定义函数 */  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();    }  }  /* 取得远程文件 */  private void getDataSource(String strPath) throws Exception  {//如果是一个正确的网址,就返回true    if (!URLUtil.isNetworkUrl(strPath))    {      mTextView01.setText("错误的URL");    } else    {      /* 取得URL */      URL myURL = new URL(strPath);      /* 创建连接 */      URLConnection conn = myURL.openConnection();      conn.connect();      /* InputStream 下载文件 */      InputStream is = conn.getInputStream();      if (is == null)      {        throw new RuntimeException("stream is null");      }      // 创建临时文件       // 两个参数分别为前缀和后缀      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);      // 打开文件进行安装(下载完成后执行的操作)      openFile(myTempFile);      try      {        is.close();      } catch (Exception ex)      {        Log.e(TAG, "error: " + ex.getMessage(), ex);      }    }  }  // 在手机上打开文件的method  private void openFile(File f)  {    Intent intent = new Intent();    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    intent.setAction(android.content.Intent.ACTION_VIEW);    /* 调用getMIMEType()来取得MimeType */    String type = getMIMEType(f);    /* 设置intent的file与MimeType */    intent.setDataAndType(Uri.fromFile(f), type);    startActivity(intent);  }  /* 判断文件MimeType的method */  private String getMIMEType(File f)  {    String type = "";    String fName = f.getName();    /* 取得扩展名 */    String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length())        .toLowerCase();    /* 依扩展名的类型决定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();    }  }  /* 当Activity处于onPause状态时,更改TextView文字状态 */  @Override  protected void onPause()  {    mTextView01 = (TextView) findViewById(R.id.myTextView1);    mTextView01.setText("下载成功");    super.onPause();  }  /* 当Activity处于onResume状态时,删除临时文件 */  @Override  protected void onResume()  {    // TODO Auto-generated method stub    /* 删除临时文件 */    delFile(currentTempFilePath);    super.onResume();  }}

另外例子中还可以通过
System.out.println("conn.getContentLength() =" + conn.getContentLength());
获取下载文件的大小,然后来实现PrgressBar的下载进度显示
获取下载文件的大小,然后来实现PrgressBar的下载进度显示


楼主这方面有研究过吗?我的listview中的ProgressBar不刷新进度。。。网络线程与listview中的一个元素如何关联更新的?还望指教 4 楼 冥风圣六翼 2012-05-14 楼主你抄归抄,要是能给出详细的讲解和你自己的认识我也会感谢你的,这你妹的抄一段教程上的源码过来有个P意义,连注释都抄的一样

读书人网 >其他相关

热点推荐