下载一个应用到SD卡然后启动系统的安装程序

来源:互联网 发布:vb自定义数据类型 编辑:程序博客网 时间:2024/04/30 04:09

1 首先建一个布局 里面放一个button(布局简单  就不写了)



2 下载 APK到 外部存储 这里 用AsyncTask来下载 (AsyncTask 不会的 看我前面 的文章)

package com.ldh.downapktosd;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;

public class MyDownAPKTask extends AsyncTask<String, Integer, String> {
    private CallBack callback;
    private int allen;

//这里 定义一个接口 待会 回调  将数据回传到MainAactivity

    public interface CallBack {
        public void start();

        public void updata(int progress);

        public void finish(String path);

    }
    public MyDownAPKTask(CallBack callback) {
        this.callback = callback;
    }
//用于更行进度条
    @Override
    protected void onProgressUpdate(Integer... values) {

        if (callback != null) {

//用接口回调来使ProgressDialog得进度条更新

            callback.updata(values[0]);
        }
    }
//用于在doInBackground启动前将ProgressDialog创建并展示出来
    @Override
    protected void onPreExecute() {

        if (callback != null) {

//用接口回调来使ProgressDialog显示出来

            callback.start();
        }
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(params[0])
                    .openConnection();
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream in = conn.getInputStream();
                allen = conn.getContentLength();

                BufferedInputStream bis = new BufferedInputStream(in);

//用来判断 外部存储是否挂载               

if (!Environment.getExternalStorageState().equals(
                        Environment.MEDIA_MOUNTED)) {
                        Log.d("print", "没有挂载好");
                        return null;

                }
                File dir = Environment.getExternalStorageDirectory();
                File file = new File(dir, "joke.apk");
                BufferedOutputStream bos = new BufferedOutputStream(
                        new FileOutputStream(file));
                int len;
                int sum = 0;

                byte[] b = new byte[1024 * 4];
                while ((len = bis.read(b)) != -1) {
                    bos.write(b, 0, len);
                    sum += len;
//用来调用onProgressUpdate使ProgressDialog的进度条更新
                    publishProgress(sum * 100 / allen);

                }
                bis.close();
                bos.close();
                Log.d("print",file.getAbsolutePath());
                return file.getAbsolutePath();

            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        if (callback != null) {
         //接口回调来回传文件下载到外部存储的路径
            callback.finish(result);
        }
    }


}



3 在MainActivity里面实现界面显示的具体操作


package com.ldh.downapktosd;

import java.io.File;

import com.ldh.downapktosd.MyDownAPKTask.CallBack;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener, CallBack {
    String str1 = "http://www.ytmfdw.com/download/joke.apk";
    private Button btn_down;
    private ProgressDialog pd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_down = (Button) findViewById(R.id.dowm);
        btn_down.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        MyDownAPKTask task = new MyDownAPKTask(this);
        task.execute(str1);

    }

//在AsyncTask里面定义的接口对象 的调用的start方法的具体实现    来创建ProgressDialog 并显示出来


    @Override
    public void start() {

        pd = new ProgressDialog(this);
        pd.setTitle("下载APK");
        pd.setMessage("正在下载。。。");
        pd.setIndeterminate(false);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setCancelable(false);
        pd.show();
        pd.setProgress(0);
        pd.setMax(100);

    }
//在AsyncTask里面定义的接口对象 的调用的updata方法的具体实现    来更新ProgressDialog
    @Override
    public void updata(int progress) {
        pd.setProgress(progress);

    }
//在AsyncTask里面定义的接口对象 的调用的finish方法的具体实现   将下载完的APK的在外部存储的路径传到系统安装应用程序的界面
    @Override
    public void finish(String path) {
        pd.dismiss();
        if (path == null) {
            Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
            return;
        }
        File file = new File(path);
        if (!file.exists()) {
            Toast.makeText(this, "", Toast.LENGTH_SHORT).show();
            return;
        }

        //进行 安装Apk 利用隐式意图来安装
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.parse("file://" + path.toString()),
                "application/vnd.android.package-archive");
        startActivity(i);

    }
}




0 0
原创粉丝点击