在做app时,你想上线就必须要做更新的接口
首先在做验证时你需要打包,把AS安装的卸载掉然后在安装打包的apk;
7.0,8.0都需要权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
在AndroidManifest中加入:
/*
注意:在有的手机上你做测试时会发现一直在
Uri apkUri = FileProvider.getUriForFile(Frag_Set_Set.this, BuildConfig.APPLICATION_ID+".provider", file);
这里一直卡住报错;有可能和我最开始的原因一样,在BuildConfig.APPLICATION_ID+".provider"及authorities="你的包名.provider"使用的是authorities="你的包名.fileprovider",把两个地方的fileprovider改成provider就可以了
*/
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="你的包名.provider"
android:grantUriPermissions="true"
android:exported="false"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
怎么下载安装包就不说了,网上大把教材,我在下载好后安装更新这卡了半天!
7.0-8.0安装其实差不大多,只不过8.0,需要申请权限
/**
* 判断是否是8.0,8.0需要处理未知应用来源权限问题,否则直接安装
*/
private void checkIsAndroidO(File file) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean b = getPackageManager().canRequestPackageInstalls();
if (b) {
installApk(file);//安装应用的逻辑(写自己的就可以)
} else {
//请求安装未知应用来源的权限
new ToastUtil().showToast(Frag_Set_Set.this,"请打开安装未知来源应用的权限,否则无法正常安装!",2000);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, 0);
}
}else {
installApk(file);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 0:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
installApk(file);
} else {
//没有权限 在 yourAppPackageName 设置你的app包名
Uri packageURI = Uri.parse("package:" + getPackageName());
Logutil.w(tag,"-->"+packageURI);
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
Frag_Set_Set.this.startActivityForResult(intent, 1);
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
checkIsAndroidO(file);
break;
default:
break;
}
}
然后就是安装了:
/**
* 安装apk
*/
private void installApk(File file) {
if (Build.VERSION.SDK_INT>=24){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
checkIsAndroidO(file);
return;
}
// intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
i.addFlags(Intent
.FLAG_ACTIVITY_NEW_TASK);//打开一个线程,防止安装好后打开时闪退
Uri apkUri = FileProvider.getUriForFile(Frag_Set_Set.this, BuildConfig.APPLICATION_ID+".provider", file);
Logutil.w(tag,"-->"+BuildConfig.APPLICATION_ID+".provider");
i.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(i);
}
//7.0以下兼容
else {
try {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive");
startActivity(i);
}catch (Exception e){
}
}
}
/*
注意:你在安装好后殿打开时出现闪退,是因为你需要开一个线程出来:i.addFlags(Intent .FLAG_ACTIVITY_NEW_TASK);
Android7.0,8.0更新app
*/