Flutter系统级功能访问插件shizuku_api的使用

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

Flutter系统级功能访问插件shizuku_api的使用

通过使用 shizuku_api 插件,您可以在 Flutter 应用中轻松访问系统的高级功能。本文档将指导您如何在 Flutter 应用中配置和使用该插件。

🌟 关于

此插件用于我的 Google Play 商店应用 System App Remover,允许用户在不使用root权限或电脑的情况下卸载系统应用(Android 10及以下版本仍需要电脑运行Shizuku)。

⚡ 安装

在您的项目中添加插件:

flutter pub add shizuku_api

📋 要求

  • 必须安装并运行 Shizuku 应用。

🔧 配置

app/build.gradle

确保 minSdk 大于等于 24:

minSdkVersion 24

AndroidManifest.xml

<application> 标签内添加以下内容:

<application>
    <!-- 其他代码 -->
    
    <provider
        android:name="rikka.shizuku.ShizukuProvider"
        android:authorities="${applicationId}.shizuku"
        android:multiprocess="false"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
</application>

🚀 使用

⚠️ 重要

在调用其他任何方法之前,必须先执行以下步骤:

  • 确保已安装 Shizuku 应用。
  • 检查 Shizuku 是否正在运行。
bool isBinderRunning = await _shizukuApiPlugin.pingBinder() ?? false; // 尝试连接 Shizuku

🛠️ 检查 Shizuku 权限

final _shizukuApiPlugin = ShizukuApi();

// 检查用户是否已授予 Shizuku 权限
// 返回值为 true 表示已允许权限,否则表示未允许或从未请求
bool checkPermission = await _shizukuApiPlugin.checkPermission();

print(checkPermission);

🛠️ 请求 Shizuku 权限

final _shizukuApiPlugin = ShizukuApi();

// 触发 Shizuku 弹出窗口
// 返回值为 true 表示已允许权限,否则表示未允许
bool requestPermission = await _shizukuApiPlugin.requestPermission(); 

print(requestPermission);

💻 运行命令

  • ⚡ 不支持 root 环境 (su)
  • ✅ 可以运行 ADB shell 命令 (正常工作)
String command = 'pm uninstall --user 0 com.android.chrome';
await _shizukuApiPlugin.runCommand(command); // 返回成功如果卸载系统应用成功,失败则返回失败

示例代码

以下是完整的示例代码,展示了如何在 Flutter 应用中使用 shizuku_api 插件:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:shizuku_api/shizuku_api.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isShizukuPermissionGranted = false;
  final _shizukuApiPlugin = ShizukuApi();
  var singleOutputController = TextEditingController(text: 'wm size');

  String outputString = '';

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  Future<void> requestPermission() async {
    bool shizukuApiPermission;
    try {
      shizukuApiPermission = await _shizukuApiPlugin.requestPermission() ?? false;
      if (kDebugMode) {
        print(shizukuApiPermission);
      }
    } on PlatformException {
      shizukuApiPermission = false;
    }

    if (!mounted) return;

    setState(() {
      _isShizukuPermissionGranted = shizukuApiPermission;
    });
  }

  Future<bool> isBinderRunning() async {
    bool isBinderRunning = await _shizukuApiPlugin.pingBinder() ?? false;
    if (kDebugMode) {
      print('isBinderRunning $isBinderRunning');
    }
    return isBinderRunning;
  }

  Future<bool> checkPermission() async {
    bool isShizukuGranted = await _shizukuApiPlugin.checkPermission() ?? false;
    if (kDebugMode) {
      print('checkPermission() $isShizukuGranted');
    }
    return isShizukuGranted;
  }

  void runCommand(String command) async {
    outputString = await _shizukuApiPlugin.runCommand(command) ?? '';
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: lightMode,
      darkTheme: darkMode,
      home: Scaffold(
        appBar: buildAppBar(),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  bool isShizukuRunning = await isBinderRunning();
                  if (isShizukuRunning == true) {
                    _isShizukuPermissionGranted = await checkPermission();
                    setState(() {});
                  }
                },
                child: Text(
                    '检查 Shizuku 权限是否授予: $_isShizukuPermissionGranted'),
              ),
              ElevatedButton(
                onPressed: () async {
                  bool i = await isBinderRunning();
                  if (i == true) {
                    requestPermission();
                  }
                },
                child: const Text('请求 Shizuku 权限'),
              ),
              TextField(
                decoration: const InputDecoration(
                    label: Text('命令'),
                    helperText:
                        '例如: pm uninstall --user 0 &lt;packageName&gt;, wm size'),
                controller: singleOutputController,
              ),
              ElevatedButton.icon(
                icon: const Icon(Icons.chevron_right_rounded),
                onPressed: () {
                  runCommand(singleOutputController.text);
                },
                label: const Text('运行命令'),
              ),
              Text(outputString)
            ],
          ),
        ),
      ),
    );
  }

  AppBar buildAppBar() {
    return AppBar(
      centerTitle: true,
      title: const Text('Shizuku Api'),
    );
  }
}

final lightMode = ThemeData(
  colorScheme: ColorScheme.fromSeed(
    seedColor: Colors.purple,
  ),
  useMaterial3: true,
);
final darkMode = ThemeData(
  colorScheme: ColorScheme.fromSeed(
    brightness: Brightness.dark,
    seedColor: Colors.purple,
  ),
  useMaterial3: true,
);

更多关于Flutter系统级功能访问插件shizuku_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter系统级功能访问插件shizuku_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于在Flutter中使用shizuku_api插件来访问系统级功能,这里提供一个基本的代码案例来展示如何集成和使用该插件。shizuku_api插件允许Flutter应用通过Shizuku服务获得更高的系统权限,从而执行一些通常需要root权限的操作。

前提条件

  1. 安装Shizuku服务:首先,你需要在你的Android设备上安装并启用Shizuku服务。Shizuku可以从官方GitHub页面或其他可信来源下载。
  2. 配置Flutter环境:确保你的Flutter开发环境已经正确配置。

步骤

  1. 添加依赖: 在你的pubspec.yaml文件中添加shizuku_api依赖。

    dependencies:
      flutter:
        sdk: flutter
      shizuku_api: ^最新版本号  # 请替换为实际可用的最新版本号
    
  2. 导入插件: 在你的Dart文件中导入shizuku_api

    import 'package:shizuku_api/shizuku_api.dart';
    
  3. 请求和检查Shizuku服务: 使用ShizukuApi类来请求和检查Shizuku服务的状态。

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      ShizukuApi? _shizukuApi;
    
      @override
      void initState() {
        super.initState();
        _initShizuku();
      }
    
      void _initShizuku() async {
        _shizukuApi = ShizukuApi();
    
        // 检查Shizuku服务是否已启用
        bool isShizukuReady = await _shizukuApi!.isShizukuReady();
        if (!isShizukuReady) {
          // 如果未启用,请求用户启用
          bool requestResult = await _shizukuApi!.requestShizuku();
          if (requestResult) {
            print('Shizuku requested successfully. Please grant permission in Shizuku Manager.');
            // 通常,这里需要用户手动在Shizuku管理器中授予权限
            // 可以引导用户到设置页面或显示提示信息
          } else {
            print('Failed to request Shizuku.');
          }
        } else {
          print('Shizuku is already ready.');
          // 执行需要高权限的操作
          _performHighPrivilegeOperation();
        }
      }
    
      void _performHighPrivilegeOperation() async {
        try {
          // 示例:获取root shell(注意:这只是一个示例,实际使用可能需要更多权限和处理)
          var result = await _shizukuApi!.exec(['sh', '-c', 'echo Hello, Shizuku!']);
          print('Command result: ${result.stdout}');
        } catch (e) {
          print('Error performing high privilege operation: $e');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Shizuku API Demo'),
            ),
            body: Center(
              child: Text('Checking Shizuku status...'),
            ),
          ),
        );
      }
    }
    

注意事项

  • 权限处理:上述代码只是展示了如何请求和检查Shizuku服务。实际使用中,用户需要在Shizuku管理器中手动授予权限。
  • 错误处理:在实际应用中,你需要添加更多的错误处理逻辑来确保应用的健壮性。
  • API限制shizuku_api插件提供的API可能有限,具体能执行哪些操作取决于Shizuku服务的限制和Android系统的安全策略。

这个代码案例提供了一个基础框架,你可以在此基础上根据具体需求扩展功能。

回到顶部