Flutter静默安装APK插件flutter_install_apk_silently的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter静默安装APK插件flutter_install_apk_silently的使用

插件介绍

flutter_install_apk_silently 是一个用于在Android设备上静默安装APK的Flutter插件,适用于自定义Android ROM和已root的设备。该插件可以在不中断用户界面的情况下安装APK文件。

版本信息与捐赠

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_install_apk_silently: ^0.2.0

2. 配置 Android 权限

AndroidManifest.xml 文件中添加必要的权限:

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

3. 根设备或模拟器设置

确保你的设备已经root。如果你使用的是模拟器,可以参考这篇博客进行root操作。

示例代码

下面是一个完整的示例代码,展示了如何使用 flutter_install_apk_silently 插件来下载并安装APK文件。

import 'dart:io';
import 'package:dio/dio.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_install_apk_silently/flutter_install_apk_silently.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _status = "idle";
  String _message = 'Please browse APK.';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              onPressed: () async {
                setState(() {
                  _status = "loading";
                  _message = "Waiting to be installed.";
                });

                var tempDir = await getTemporaryDirectory();
                String fullPath = "${tempDir.path}/app_${DateTime.now().millisecondsSinceEpoch}.apk";
                print('full path $fullPath');

                Dio dio = Dio();
                await download(dio, fullPath);

                File file = File(fullPath);

                Future.delayed(Duration(seconds: 1), () async {
                  bool isInstalled = await FlutterInstallApkSilently.installAPK(file: file);
                  if (isInstalled) {
                    setState(() {
                      _status = "success";
                      _message = "The APK is installed successfully.";
                    });
                  } else {
                    setState(() {
                      _status = "failed";
                      _message = "The APK installation failed.";
                    });
                  }
                });
              },
              child: Text("Download from Internet", style: TextStyle(fontSize: 24.0)),
            ),
            RaisedButton(
              onPressed: () async {
                File file = await FilePicker.getFile(type: FileType.custom, allowedExtensions: ['apk']);

                setState(() {
                  _status = "loading";
                  _message = "Waiting to be installed.";
                });

                Future.delayed(Duration(seconds: 1), () async {
                  bool isInstalled = await FlutterInstallApkSilently.installAPK(file: file);
                  if (isInstalled) {
                    setState(() {
                      _status = "success";
                      _message = "The APK is installed successfully.";
                    });
                  } else {
                    setState(() {
                      _status = "failed";
                      _message = "The APK installation failed.";
                    });
                  }
                });
              },
              child: Text("Browse APK", style: TextStyle(fontSize: 24.0)),
            ),
            (_status == "loading")
                ? Center(child: CircularProgressIndicator())
                : (_status == "success")
                    ? Center(child: Icon(Icons.check, color: Colors.green, size: 35.0))
                    : (_status == "failed")
                        ? Center(child: Icon(Icons.clear, color: Colors.red, size: 35.0))
                        : Container(),
            Text("$_message", style: TextStyle(fontSize: 24.0)),
            RaisedButton(
              onPressed: () async {
                bool result = await FlutterInstallApkSilently.rebootDevice();
                if (result) {
                  // Device will reboot
                }
              },
              child: Text("Reboot device", style: TextStyle(fontSize: 24.0)),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> download(Dio dio, String savePath) async {
    try {
      Response response = await dio.get(
        'your-apk-url-here', // 替换为实际的APK下载链接
        options: Options(
          responseType: ResponseType.bytes,
          followRedirects: false,
          validateStatus: (status) => status < 500,
        ),
      );

      File file = File(savePath);
      var raf = file.openSync(mode: FileMode.write);
      raf.writeFromSync(response.data);
      await raf.close();
    } catch (e) {
      print(e);
    }
  }
}

注意事项

  1. Root权限:此插件仅适用于已root的设备或自定义ROM。
  2. 权限配置:确保在 AndroidManifest.xml 中正确配置了安装和删除应用的权限。
  3. 安全性:静默安装APK存在一定的安全风险,请谨慎使用,并确保只安装来自可信来源的APK文件。

反馈与贡献

这是一个beta版本的插件,欢迎任何问题反馈或贡献代码。你可以在GitHub上找到更多信息。


希望这个指南能帮助你成功集成并使用 flutter_install_apk_silently 插件!如果有任何问题,欢迎随时提问。


更多关于Flutter静默安装APK插件flutter_install_apk_silently的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter静默安装APK插件flutter_install_apk_silently的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用 flutter_install_apk_silently 插件进行 APK 静默安装的 Flutter 代码示例。这个插件允许你在不需要用户交互的情况下安装 APK 文件。请注意,静默安装通常需要设备具有 root 权限或者应用具有特定的系统权限,这在普通用户设备上可能无法实现。

首先,你需要在 pubspec.yaml 文件中添加 flutter_install_apk_silently 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_install_apk_silently: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 项目中,你可以使用以下代码来静默安装 APK:

import 'package:flutter/material.dart';
import 'package:flutter_install_apk_silently/flutter_install_apk_silently.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('APK 静默安装示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _installApk,
            child: Text('安装 APK'),
          ),
        ),
      ),
    );
  }

  Future<void> _installApk() async {
    try {
      // 确保 APK 文件路径正确
      String apkPath = "/path/to/your/app.apk";  // 替换为你的 APK 文件路径
      File apkFile = File(apkPath);

      // 检查文件是否存在
      if (!apkFile.existsSync()) {
        throw Exception("APK 文件不存在");
      }

      // 调用插件进行静默安装
      bool isInstalled = await FlutterInstallApkSilently.installApk(apkPath);

      if (isInstalled) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('APK 安装成功')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('APK 安装失败')),
        );
      }
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('发生错误: ${e.toString()}')),
      );
    }
  }
}

注意事项

  1. 权限要求:静默安装通常需要设备 root 权限或特定的系统权限。在普通用户设备上,静默安装可能无法实现,并会抛出错误。
  2. APK 路径:确保 APK 文件的路径正确,并且文件存在。
  3. 错误处理:在真实应用中,添加更详细的错误处理逻辑,以便更好地处理各种异常情况。

测试环境

由于静默安装涉及到系统级操作,建议在具有 root 权限的模拟器或开发设备上进行测试。对于普通用户设备,建议通过应用内提示用户手动安装 APK。

希望这个示例能帮助你理解如何使用 flutter_install_apk_silently 插件进行 APK 的静默安装。

回到顶部