当前位置:   article > 正文

Flutter 实现安卓端更新功能_flutterdownloader.loadtaskswithrawquery

flutterdownloader.loadtaskswithrawquery

Flutter  实现安卓端更新功能,一般需要以下几个步骤:

1.  获取当前应用的版本信息,比如版本号(versionCode)和版本名(versionName)。

2.  与服务器进行比对,检查是否有新版本的更新。

3.  如果有新版本,下载并安装更新包。

以下是具体的代码实现过程:

1.  获取当前应用的版本信息

我们可以使用  package_info  插件来获取当前应用的版本信息。在  pubspec.yaml  文件中添加依赖:

  1. dependencies:
  2. package_info: ^0.4.0

在代码中引入插件,并获取版本信息:

  1. import 'package:package_info/package_info.dart';
  2. PackageInfo packageInfo = await PackageInfo.fromPlatform();
  3. String packageName = packageInfo.packageName;
  4. String versionName = packageInfo.version;
  5. int versionCode = int.parse(packageInfo.buildNumber);

2.  与服务器进行比对,检查是否有新版本的更新

我们需要在服务器端维护一个版本信息文件,用来记录最新版本的版本号和下载地址等信息。通常我们会使用  JSON  格式来保存版本信息。下面是一个版本信息文件示例:

  1. {
  2. "versionCode": 2,
  3. "versionName": "1.1.0",
  4. "downloadUrl": "http://example.com/update.apk",
  5. "changelog": "1. 修复了已知的 bug"
  6. }


2. 增加了新功能

我们可以使用  http  插件来获取版本信息文件中的内容。在  pubspec.yaml  文件中添加依赖:

  1. dependencies:
  2. http: ^0.13.3

在代码中引入插件,并发起  http  请求获取版本信息文件内容:

  1. import 'dart:convert';
  2. import 'package:http/http.dart' as http;
  3. try {
  4. var response = await http.get(Uri.parse('http://example.com/version.json'));
  5. if (response.statusCode == 200) {
  6. var data = jsonDecode(response.body);
  7. int newVersionCode = data['versionCode'];
  8. if (newVersionCode > versionCode) {
  9. String newVersionName = data['versionName'];
  10. String downloadUrl = data['downloadUrl'];
  11. String changelog = data['changelog'];
  12. // ...
  13. } else {
  14. // 已经是最新版本
  15. }
  16. } else {
  17. // 请求失败
  18. }
  19. } catch (e) {
  20. // 请求出现异常
  21. }

3.  下载并安装更新包

如果有新版本更新,我们需要下载并安装更新包。通常我们会在应用的内部存储空间中创建一个文件夹来保存更新包。在  Android  系统中,可以使用  Intent.ACTION_VIEW  意图来启动系统自带的安装器来安装  APK  文件。以下是具体的代码实现:

  1. import 'package:path_provider/path_provider.dart';
  2. import 'package:flutter_downloader/flutter_downloader.dart';
  3. // 获取应用内部存储空间中的文件夹路径
  4. String getDownloadDirectory() {
  5. String directory = '';
  6. if (Platform.isAndroid) {
  7. directory = '/storage/emulated/0/Android/data/${packageName}/files/Download';
  8. } else if (Platform.isIOS) {
  9. directory = (await getApplicationSupportDirectory()).path;
  10. }
  11. return directory;
  12. }
  13. FlutterDownloader.initialize();
  14. final taskId = await FlutterDownloader.enqueue(
  15. url: downloadUrl,
  16. savedDir: getDownloadDirectory(),
  17. showNotification: true,
  18. openFileFromNotification: true,
  19. );
  20. // 启动安装器安装 APK 文件
  21. if (await FlutterDownloader.loadTasksWithRawQuery(query: 'SELECT * FROM task WHERE task_id=?', arguments: [taskId]).then((tasks) => tasks[0].status) == DownloadTaskStatus.complete) {
  22. OpenFile.open('${getDownloadDirectory()}/update.apk');
  23. }

完整的实现代码示例可以参考  https://github.com/openflutter/flutter_app_update。注意,在安装器中安装  APK  文件需要用户授权,需要在  AndroidManifest.xml  文件中添加以下权限:

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

还需要在  MainActivity  中添加以下代码:

  1. @Override
  2. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. if (requestCode == InstallApkPlugin.REQUEST_CODE_INSTALL_APK && resultCode == RESULT_OK) {
  5. Uri uri = data.getData();
  6. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  7. if (getPackageManager().canRequestPackageInstalls()) {
  8. Intent intent = new Intent(Intent.ACTION_VIEW);
  9. intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  10. intent.setDataAndType(uri, "application/vnd.android.package-archive");
  11. startActivity(intent);
  12. }
  13. } else {
  14. Intent intent = new Intent(Intent.ACTION_VIEW);
  15. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  16. intent.setDataAndType(uri, "application/vnd.android.package-archive");
  17. startActivity(intent);
  18. }
  19. }
  20. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/549344
推荐阅读
相关标签
  

闽ICP备14008679号