话不多说,有过开发过移动应用的人都应该自动升级流程,首先获取本地应用版本,然后从服务器获取线上移动应用版本号作比较是否升级。
第一步获取版本信息
API:https://pub.dev/packages/package_info
/**
* 获取应用版本号
* */
_getVersion() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
setState(() {
_version = packageInfo.version;
});
}
第二步获取文件存储路径
API:https://pub.dev/packages/path_provider
/**
* 获取文件存储路径
* */
_getSavePath() async {
var directory = await getExternalStorageDirectory();
String storageDirectory = directory.path;
_savePath = storageDirectory;
print("StorageDirectory:${_savePath}");
}
第三步获检查应用的存储权限
API:https://pub.dev/packages/permission_handler
/**
* 检测存储权限
* */
Future<bool> _checkPermission() async {
if (Theme
.of(context)
.platform == TargetPlatform.android) {
final status = await Permission.storage.status;
if (status != PermissionStatus.granted) {
final result = await Permission.storage.request();
if (result == PermissionStatus.granted) {
return true;
} else {
return false;
}
} else {
return true;
}
}
return false;
}
第四步下载需要升级的应用地址
API: https://pub.dev/packages/dio
/**
* 下载应用
* */
_download() async {
_checkPermission();
String appName = "bby.apk";
String downPath = "$_savePath/$appName";
String apkUrl = "https://xxxxxx.apk";//远程应用地址
Dio dio = new Dio();
await dio.download(
apkUrl, downPath, onReceiveProgress: (int count, int total) {
print("${(count / total * 100).toStringAsFixed(0)}%");
setState(() {
_value = double.tryParse((count / total).toStringAsFixed(1));
});
});
print("$downPath");
await OpenFile.open(
downPath, type: "application/vnd.android.package-archive");
}
第五步打开下载文件
API:https://pub.dev/packages/open_file
由于是.apk文件打开方式为
{".apk", "application/vnd.android.package-archive"},
await OpenFile.open( downPath, type: "application/vnd.android.package-archive");
另外要配置 ,不然安装的时候可能会找不到文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="xxx.xxx.xxxxx">
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"
tools:replace="android:resource" />
</provider>
</application>
</manifest>
filepaths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
name="camera_photos"
path="" />
<external-path
name="files_root"
path="Android/data/你的应用包名/" />
<external-path
name="external_storage_root"
path="." />
</paths>
</resources>
不要忘了Android需要添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />