请先移步 下载服务器上文件时的配置
添加权限
<!--未知应用安装权限-->
<uses-permission android:name="android.permission.REPLACE_EXISTING_PACKAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
在manifest的application标签下添加
<!-- android:authorities="包名.fileprovider" />-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.mydemo.test3.fileprovider"
android:exported="false"
tools:replace="android:authorities"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
在res的xml文件夹下新建provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- com.example.mydemo.myapplication 更改为你的包名-->
<external-path path="Android/data/com.example.mydemo.myapplication/" name="files_root" />
<external-path path="." name="external_storage_root" />
</paths>
Activity
/**
* @anthor GrainRain
* @funcation
* @date 2019/10/28
*/
public class UpgradeAct extends Activity {
private String filePath = Environment.getExternalStorageDirectory() + "/UnmannedShip";
private String apkName = "apkTest.apk";
private Button button1;
public static final int downloadAPKRequestCode = 200;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//动态获取权限
ApplyPermission.ApplyPermission(UpgradeAct.this);
button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new UpgradeAPKUtil("http://47.112.96.171:8081/DownloadFile/apkTest.apk",
filePath, apkName, UpgradeAct.this);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("---------------", requestCode + " " + resultCode);
switch (requestCode) {
case downloadAPKRequestCode:
if(resultCode == -1) {
UpgradeAPKUtil.installApk(UpgradeAct.this, filePath, apkName);
}
}
}
}
下载安装apk工具类
instartApk类里需要修改包名
public class UpgradeAPKUtil {
private String downloadAPKUrl, filePath, APKName;
private static Activity activity;
//APKName 保存的apk名
public UpgradeAPKUtil(String downloadAPKUrl, String installAPKPath, String APKName, Activity activity) {
setAPKName(APKName);
setDownloadAPKUrl(downloadAPKUrl);
setFilePath(installAPKPath);
setActivity(activity);
new Thread(downloadApkRunnable).start();
showProgressDialog(activity, "正在下载apk...", 100);
}
//下载APK的子线程
Runnable downloadApkRunnable = new Runnable() {
@Override
public void run() {
// TODO
// 在这里进行 http request.网络请求相关操作
DownloadUtil.get().download(getDownloadAPKUrl(), getFilePath(), getAPKName(),
new DownloadUtil.OnDownloadListener() {
@Override
public void onDownloadSuccess(File file) {
Log.e("---------", "onDownloadSuccess");
instartApk(getActivity(), getFilePath(), getAPKName());
}
@Override
public void onDownloading(int progress) {
Log.e("---------", "onDownloading " + progress);
progressDialogNum = progress;
}
@Override
public void onDownloadFailed(Exception e) {
Log.e("---------", "onDownloadFailed " + e.getMessage());
}
});
}
};
//兼容8.0安装位置来源的权限
private void instartApk(Activity activity, String downloadApkPath, String apkName) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//是否有安装位置来源的权限
boolean haveInstallPermission = activity.getPackageManager().canRequestPackageInstalls();
if (haveInstallPermission) {
installApk(activity, downloadApkPath, apkName);
} else {
//com.example.mydemo.myapplication更改为你的包名
Uri packageUri = Uri.parse("package:" + "com.example.mydemo.myapplication");
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageUri);
getActivity().startActivityForResult(intent, downloadAPKRequestCode);
}
} else {
installApk(activity, downloadApkPath, apkName);
}
}
//根据安装包路径安装apk
public static void installApk(Activity activity, String apkPath, String apkName) {
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(apkPath + "/" + apkName);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(activity, "com.example.mydemo.myapplication.fileprovider", apkFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
}
activity.startActivity(intent);
}
//进度条dialog
//进度
private static int progressDialogNum = 0;
private static void showProgressDialog(Context context, String title, final int max_progress) {
final ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setProgress(0);
progressDialog.setTitle(title);
//设置样式
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(max_progress);
//禁止通过点击屏幕和返回键来取消对话框
progressDialog.setCancelable(false);
progressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
while (progressDialogNum < max_progress){
try {
progressDialog.setProgress(progressDialogNum);
} catch (Exception e){
e.printStackTrace();
}
}
// 进度达到最大值后,窗口消失
progressDialog.cancel();
progressDialogNum = 0;
}
}).start();
}
private String getDownloadAPKUrl() {
return downloadAPKUrl;
}
private void setDownloadAPKUrl(String downloadAPKUrl) {
this.downloadAPKUrl = downloadAPKUrl;
}
private String getFilePath() {
return filePath;
}
private void setFilePath(String filePath) {
this.filePath = filePath;
}
private String getAPKName() {
return APKName;
}
private void setAPKName(String APKName) {
this.APKName = APKName;
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
}