Flutter系统级功能访问插件shizuku_api的使用
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 <packageName>, 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
更多关于Flutter系统级功能访问插件shizuku_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于在Flutter中使用shizuku_api
插件来访问系统级功能,这里提供一个基本的代码案例来展示如何集成和使用该插件。shizuku_api
插件允许Flutter应用通过Shizuku服务获得更高的系统权限,从而执行一些通常需要root权限的操作。
前提条件
- 安装Shizuku服务:首先,你需要在你的Android设备上安装并启用Shizuku服务。Shizuku可以从官方GitHub页面或其他可信来源下载。
- 配置Flutter环境:确保你的Flutter开发环境已经正确配置。
步骤
-
添加依赖: 在你的
pubspec.yaml
文件中添加shizuku_api
依赖。dependencies: flutter: sdk: flutter shizuku_api: ^最新版本号 # 请替换为实际可用的最新版本号
-
导入插件: 在你的Dart文件中导入
shizuku_api
。import 'package:shizuku_api/shizuku_api.dart';
-
请求和检查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系统的安全策略。
这个代码案例提供了一个基础框架,你可以在此基础上根据具体需求扩展功能。