Flutter应用管理插件apps_handler的使用

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

Flutter应用管理插件apps_handler的使用

插件介绍

apps_handler 是一个Flutter插件,用于获取安装在Android设备上的应用程序信息、监控应用程序的安装和卸载事件,并且可以启动应用程序。它支持获取详细的应用程序信息、检查特定应用程序是否已安装、打开应用程序设置等。

安装插件

首先,在你的pubspec.yaml文件中添加以下依赖项:

dependencies:
  apps_handler: ^latest_version

平台支持

  • Android: 支持
  • iOS: 不支持
  • MacOS: 不支持
  • Web: 不支持
  • Linux: 不支持
  • Windows: 不支持

必需权限

对于Android 11 (API level 30) 及以上版本,需要在AndroidManifest.xml中添加以下权限:

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

<queries>
    <intent>
        <action android:name="android.intent.action.MAIN" />
    </intent>
</queries>

使用示例

import 'package:flutter/material.dart';
import 'package:apps_handler/apps_handler.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Apps Handler Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<AppInfo> _apps = [];
  bool _isLoading = false;
  String _lastEvent = 'No events yet';

  Future<void> _loadApps() async {
    setState(() {
      _isLoading = true;
    });

    try {
      final apps = await AppsHandler.getInstalledApps(
        includeSystemApps: true,
        includeAppIcons: true,
        onlyAppsWithLaunchIntent: true,
      );

      if (!mounted) return;
      setState(() {
        _apps = apps;
      });
    } catch (e) {
      if (!mounted) return;
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error loading apps: $e')),
      );
    } finally {
      if (mounted) {
        setState(() {
          _isLoading = false;
        });
      }
    }
  }

  void _listenToAppChanges() {
    AppsHandler.appChanges.listen((event) {
      setState(() {
        _lastEvent = 'App ${event.packageName} was ${event.event}';
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Apps Handler'),
        actions: [
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: _loadApps,
          ),
        ],
      ),
      body: Column(
        children: [
          // Last event display
          Container(
            padding: const EdgeInsets.all(8.0),
            color: Colors.grey[200],
            width: double.infinity,
            child: Text(
              _lastEvent,
              style: Theme.of(context).textTheme.bodyMedium,
            ),
          ),
          // Apps list
          Expanded(
            child: _isLoading
                ? const Center(child: CircularProgressIndicator())
                : ListView.builder(
                    itemCount: _apps.length,
                    itemBuilder: (context, index) {
                      final app = _apps[index];
                      return ListTile(
                        leading: app.appIcon != null
                            ? Image.memory(Uint8List.fromList(app.appIcon!))
                            : Icon(Icons.android),
                        title: Text(app.appName),
                        subtitle: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Text(app.packageName),
                            Text(
                                'Version: ${app.versionName ?? 'Unknown'} (${app.versionCode})'),
                            Text('Category: ${app.category}'),
                          ],
                        ),
                        isThreeLine: true,
                        trailing: Row(
                          mainAxisSize: MainAxisSize.min,
                          children: [
                            IconButton(
                              icon: const Icon(Icons.settings),
                              onPressed: () {
                                Navigator.pop(context);
                                _openAppSettings(app.packageName);
                              },
                              tooltip: 'Open Settings',
                            ),
                            IconButton(
                              icon: const Icon(Icons.delete),
                              onPressed: () {
                                showDialog(
                                  context: context,
                                  builder: (context) =&gt; AlertDialog(
                                    title: Text('Uninstall ${app.appName}?'),
                                    content: Text(
                                        'Are you sure you want to uninstall ${app.appName}?'),
                                    actions: TextButton(
                                      onPressed: () {
                                        Navigator.pop(context);
                                        _uninstallApp(app.packageName);
                                      },
                                      child: const Text('Uninstall'),
                                    ),
                                  ),
                                );
                              },
                              tooltip: 'Uninstall',
                            ),
                            IconButton(
                              icon: const Icon(Icons.launch),
                              onPressed: () {
                                Navigator.pop(context);
                                _openApp(app.packageName);
                              },
                              tooltip: 'Launch',
                            ),
                          ],
                        ),
                      );
                    },
                  ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter应用管理插件apps_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用管理插件apps_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter应用管理插件apps_handler的使用,这里提供一个简单的代码案例来展示如何使用该插件来检查应用是否安装以及启动其他应用。

首先,确保你已经在pubspec.yaml文件中添加了apps_handler依赖:

dependencies:
  flutter:
    sdk: flutter
  apps_handler: ^x.y.z  # 替换为当前最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用apps_handler插件。以下是一个简单的示例,展示如何检查某个应用是否安装以及启动该应用。

import 'package:flutter/material.dart';
import 'package:apps_handler/apps_handler.dart';

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

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

class _MyAppState extends State<MyApp> {
  String _appStatus = "Checking...";

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Apps Handler Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                _appStatus,
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  bool isInstalled = await AppsHandler.isAppInstalled("com.example.package");
                  setState(() {
                    _appStatus = isInstalled ? "App is installed" : "App is not installed";
                  });

                  if (isInstalled) {
                    bool isLaunched = await AppsHandler.launchApp("com.example.package");
                    if (isLaunched) {
                      _appStatus += "\nApp launched successfully.";
                    } else {
                      _appStatus += "\nFailed to launch app.";
                    }
                  }
                },
                child: Text('Check & Launch App'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先导入了flutterapps_handler包。
  2. 创建了一个简单的Flutter应用,包含一个文本显示应用状态和一个按钮。
  3. 当按钮被点击时,使用AppsHandler.isAppInstalled方法来检查指定的应用(通过其包名)是否已安装。
  4. 如果应用已安装,则使用AppsHandler.launchApp方法来尝试启动该应用。
  5. 更新UI以显示应用的状态(是否安装以及是否成功启动)。

请注意,你需要将"com.example.package"替换为你想要检查的应用的实际包名。

这个示例展示了如何使用apps_handler插件的基本功能。根据实际需求,你可以进一步扩展和自定义这个示例。

回到顶部