Flutter安全获取已安装应用列表插件installed_apps_safe_permission的使用

Flutter安全获取已安装应用列表插件installed_apps_safe_permission的使用

插件说明

Installed Apps 插件为 Flutter 提供了与设备上已安装的应用程序相关的实用方法。

目前,仅支持 Android 平台。


开始使用

  1. 安装指南
  2. 示例项目

使用方法

获取已安装应用程序列表
List<AppInfo> apps = await InstalledApps.getInstalledApps(
    bool excludeSystemApps, // 是否排除系统应用
    bool withIcon,           // 是否包含图标
    String packageNamePrefix // 包名前缀过滤器
);
  • 使用 packageNamePrefix 参数可以筛选出包名以特定前缀开头的应用程序。
根据包名获取应用信息
AppInfo app = await InstalledApps.getAppInfo(String packageName);
AppInfo 模型类
class AppInfo {
  String name;              // 应用名称
  Uint8List? icon;          // 应用图标(可选)
  String packageName;       // 包名
  String versionName;       // 版本名称
  int versionCode;          // 版本号
  BuiltWith builtWith;      // 构建工具
  int installedTimestamp;   // 安装时间戳
}
启动指定包名的应用程序
InstalledApps.startApp(String packageName);
打开指定包名的应用设置页面
InstalledApps.openSettings(String packageName);
判断是否为系统应用
bool isSystemApp = await InstalledApps.isSystemApp(String packageName);
卸载指定包名的应用程序
bool uninstallIsSuccessful = await InstalledApps.uninstallApp(String packageName);
检查应用是否已安装
bool appIsInstalled = await InstalledApps.isAppInstalled(String packageName);

完整示例代码

以下是一个完整的 Flutter 示例代码,展示如何使用 installed_apps_safe_permission 插件来获取并显示设备上的已安装应用列表。

示例代码

import 'package:flutter/material.dart';
import 'package:installed_apps_safe_permission/installed_apps_safe_permission.dart'; // 导入插件
import 'package:permission_handler/permission_handler.dart'; // 权限管理插件

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '已安装应用列表',
      home: InstalledAppsScreen(),
    );
  }
}

class InstalledAppsScreen extends StatefulWidget {
  @override
  _InstalledAppsScreenState createState() => _InstalledAppsScreenState();
}

class _InstalledAppsScreenState extends State<InstalledAppsScreen> {
  List<AppInfo> _apps = []; // 存储已安装应用的信息
  bool _loading = true;

  @override
  void initState() {
    super.initState();
    _fetchInstalledApps();
  }

  Future<void> _fetchInstalledApps() async {
    // 请求权限
    if (await Permission.storage.request().isGranted) {
      try {
        // 获取已安装应用列表
        final apps = await InstalledAppsSafePermission.getInstalledApps(
            excludeSystemApps: true, // 排除系统应用
            withIcon: true,           // 包含图标
            packageNamePrefix: null   // 不限制包名前缀
        );
        setState(() {
          _apps = apps;
          _loading = false;
        });
      } catch (e) {
        print("获取应用列表失败: $e");
        setState(() => _loading = false);
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('已安装应用列表'),
      ),
      body: _loading
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: _apps.length,
              itemBuilder: (context, index) {
                final app = _apps[index];
                return ListTile(
                  leading: app.icon != null
                      ? CircleAvatar(
                          backgroundImage: MemoryImage(app.icon!),
                        )
                      : null,
                  title: Text(app.name),
                  subtitle: Text(app.packageName),
                  onTap: () {
                    // 示例:跳转到应用详情页面
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => AppDetailScreen(app: app),
                      ),
                    );
                  },
                );
              },
            ),
    );
  }
}

// 应用详情页面
class AppDetailScreen extends StatelessWidget {
  final AppInfo app;

  const AppDetailScreen({required this.app});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(app.name),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('包名: ${app.packageName}'),
            Text('版本: ${app.versionName} (${app.versionCode})'),
            Text('安装时间: ${DateTime.fromMillisecondsSinceEpoch(app.installedTimestamp).toString()}'),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 权限管理:在 Android 上,访问已安装应用列表需要 READ_EXTERNAL_STORAGEQUERY_ALL_PACKAGES 权限。
  2. 平台支持:该插件目前仅支持 Android 平台,iOS 不支持。
  3. 依赖管理:确保在 pubspec.yaml 中添加依赖项:
    dependencies:
      installed_apps_safe_permission: ^latest_version
      permission_handler: ^latest_version
1 回复

更多关于Flutter安全获取已安装应用列表插件installed_apps_safe_permission的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想安全地获取已安装应用列表,可以使用 installed_apps_safe_permission 插件。这个插件允许你在请求用户权限后获取已安装应用的列表,并且遵循了Android的权限管理规范。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  installed_apps_safe_permission: ^1.0.0  # 请使用最新版本

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

2. 请求权限

在获取已安装应用列表之前,你需要请求用户授予 QUERY_ALL_PACKAGES 权限。这个权限在Android 11及以上版本中是必需的。

import 'package:installed_apps_safe_permission/installed_apps_safe_permission.dart';

Future<void> requestPermission() async {
  bool hasPermission = await InstalledAppsSafePermission.hasPermission();
  if (!hasPermission) {
    await InstalledAppsSafePermission.requestPermission();
  }
}

3. 获取已安装应用列表

在确保用户已经授予权限后,你可以使用 InstalledAppsSafePermission.getInstalledApps() 方法来获取已安装应用的列表。

import 'package:installed_apps_safe_permission/installed_apps_safe_permission.dart';

Future<void> getInstalledApps() async {
  List<AppInfo> apps = await InstalledAppsSafePermission.getInstalledApps();
  for (var app in apps) {
    print('App Name: ${app.appName}, Package Name: ${app.packageName}');
  }
}

4. 处理权限拒绝的情况

如果用户拒绝了权限请求,你可以提示用户并引导他们去设置中手动授予权限。

import 'package:installed_apps_safe_permission/installed_apps_safe_permission.dart';

Future<void> checkAndRequestPermission() async {
  bool hasPermission = await InstalledAppsSafePermission.hasPermission();
  if (!hasPermission) {
    bool granted = await InstalledAppsSafePermission.requestPermission();
    if (!granted) {
      // 提示用户去设置中手动授予权限
      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: Text('权限被拒绝'),
          content: Text('请去设置中手动授予权限以获取已安装应用列表。'),
          actions: [
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: Text('确定'),
            ),
          ],
        ),
      );
    }
  }
}

5. 完整示例

以下是一个完整的示例,展示了如何请求权限并获取已安装应用列表:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  List<AppInfo> apps = [];

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

  Future<void> checkAndRequestPermission() async {
    bool hasPermission = await InstalledAppsSafePermission.hasPermission();
    if (!hasPermission) {
      bool granted = await InstalledAppsSafePermission.requestPermission();
      if (!granted) {
        showDialog(
          context: context,
          builder: (context) => AlertDialog(
            title: Text('权限被拒绝'),
            content: Text('请去设置中手动授予权限以获取已安装应用列表。'),
            actions: [
              TextButton(
                onPressed: () {
                  Navigator.of(context).pop();
                },
                child: Text('确定'),
              ),
            ],
          ),
        );
      } else {
        getInstalledApps();
      }
    } else {
      getInstalledApps();
    }
  }

  Future<void> getInstalledApps() async {
    List<AppInfo> installedApps = await InstalledAppsSafePermission.getInstalledApps();
    setState(() {
      apps = installedApps;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('已安装应用列表'),
      ),
      body: ListView.builder(
        itemCount: apps.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(apps[index].appName),
            subtitle: Text(apps[index].packageName),
          );
        },
      ),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!