功能:
功能就是在手機上聯網下載最新的手機安裝包,然後自動安裝,模擬的是手機自動更新的功能,有興趣的可以看一下。
預覽:
例子下載
https://download.csdn.net/download/ljp345775/12548884
用到的技術:
1、動態申請權限,我這裏用到了嚴振杰老師的第三方permission
2、網絡下載文件,我這裏用到的是OKhttp3,如果有興趣可以看一下我以前的一遍文章 Okhttp3封裝帶保存cookie
3、進度條,我用的是 PictureProgressBar
4、 FileProvider的使用
5、android 10.0 的保存適配
代碼實現:
onCreate方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity = this;
//判斷手機版本來申請權限
if(Build.VERSION.SDK_INT<29){
PermissionUtils.applyPermission(mActivity, this);
}else {
setContentView(R.layout.activity_main);
initView();
//拿到保存的根目錄
if (FileUtils.mkdir(mActivity)) {
rootPath = FileUtils.getRootPath(mActivity);
}
}
}
申請權限實現的方法
/**
* 同意的權限
*
* @param data
*/
@Override
public void onGranted(List<String> data) {
if (Build.VERSION.SDK_INT < 29) {
if (data.contains(Manifest.permission.READ_EXTERNAL_STORAGE) && data.contains(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
setContentView(R.layout.activity_main);
initView();
if (FileUtils.mkdir(mActivity)) {
rootPath = FileUtils.getRootPath(mActivity);
}
}
} else {
setContentView(R.layout.activity_main);
initView();
if (FileUtils.mkdir(mActivity)) {
rootPath = FileUtils.getRootPath(mActivity);
}
}
}
/**
* 決絕的權限
*
* @param data
*/
@Override
public void onDenied(List<String> data) {
if (Build.VERSION.SDK_INT >= 29) {
setContentView(R.layout.activity_main);
initView();
if (FileUtils.mkdir(mActivity)) {
rootPath = FileUtils.getRootPath(mActivity);
}
}
}
點擊事件
@Override
public void onClick(View view) {
if (view.getId() == R.id.btn_down) {
new AlertDialog.Builder(mActivity)
.setTitle("提示")
.setMessage("目前有新版本,已優化,請點擊確定升級")
.setPositiveButton("確定", (dialog, which) -> {
//下載手機apk
downApk();
})
.create()
.show();
}
}
downApk方法
/**
* 聯網下載apk
*/
private void downApk() {
try {
UtilsOKHttp.getInstance(mActivity).downFile(url, rootPath, new UtilsOKHttp.OKCallback() {
@Override
public void onSuccess(String result) {
//成功返回文件目錄
if (result != null && result.length() > 0) {
//開始安裝
installApk(result);
}
}
@Override
public void onProcess(int i) {
//過程
pb1.setProgress(i);
if (i == 100) {
Toast.makeText(mActivity, "下載成功", Toast.LENGTH_SHORT).show();
pb1.setAnimRun(false);
}
}
@Override
public void onFail(String failResult) {
//失敗
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
downApk方法
/**
* 安裝 apk
*
* @param path
*/
private void installApk(String path) {
try {
File file = new File(path);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri data = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判斷版本大於等於7.0
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 給目標應用一個臨時授權
// 注意 下面參數com.com.ljp.downdemo 爲apk的包名加上.fileprovider,
data = FileProvider.getUriForFile(mActivity, "com.ljp.downdemo.fileprovider", file);
} else {
data = Uri.fromFile(file);
}
intent.setDataAndType(data, "application/vnd.android.package-archive");
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}