1. 程式人生 > 實用技巧 >android下載apk並安裝

android下載apk並安裝

1、設定許可權

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>

2、業務程式碼

package com.example.esri.app04.network;

import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private File apkFile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void downloadAPK(View v){
        final ProgressDialog dialog = new ProgressDialog(this);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.show();

        //準備用於儲存apk檔案的file物件 放在sd卡里面
        apkFile = new File(getExternalFilesDir(null), "update.apk");

        //啟動分執行緒下載資料,顯示下載進度
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    //1 得到連結物件
                    String path = "http://192.168.0.184:8080/storage.apk";
                    URL url = new URL(path);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setConnectTimeout(5000);
                    connection.setReadTimeout(10000);
                    connection.connect();
                    int responseCode = connection.getResponseCode();
                    if(responseCode == 200){
                        //設定dialog最大進度
                        dialog.setMax(connection.getContentLength());
                        InputStream is = connection.getInputStream();
                        FileOutputStream fos = new FileOutputStream(apkFile);
                        byte[] buffer = new byte[1024];
                        int len = -1;
                        while ((len = is.read(buffer)) != -1){
                            fos.write(buffer, 0, len);
                            dialog.incrementProgressBy(len);

                        }
                        fos.close();
                        is.close();

                    }
                    connection.disconnect();
                    //主執行緒,移除dialog,啟動安裝
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            dialog.dismiss();
                            installAPK();
                        }
                    });
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }).start();

    }

    /**
     * 啟動安裝apk
     */
    private void installAPK() {
        Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE");
        intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
        startActivity(intent);
    }
}