Flutter隐私屏幕保护插件privacy_screen的使用

Flutter隐私屏幕保护插件privacy_screen的使用

Flutter插件privacy_screen提供了一种在应用进入后台时隐藏内容的隐私屏功能。该插件在iOS上使用Swift编写,在Android上使用Kotlin编写,以确保在Flutter进入原生视图(如来自原生插件)时仍能正常工作。

特性

平台 功能
iOS ✅自定义隐私屏幕图片
Android ❌不支持自定义隐私屏幕图片
iOS ❌禁用截图
Android ⚠️仅在Flutter窗口中有效
iOS ✅自动锁触发与原生生命周期同步
Android ✅自动锁触发与原生生命周期同步
iOS ✅原生生命周期监听器
Android ✅原生生命周期监听器

缺点

  • iOS: 锁定不能在显示原生视图时呈现,因为Flutter的视图无法覆盖原生视图控制器。
  • Android: FLAG_SECURE目前仅对Flutter窗口有效,因此在原生视图中不会生效。无法自定义隐私视图。

使用方法

安装

pubspec.yaml文件中添加privacy_screen依赖:

dependencies:
  privacy_screen: ^latest_version

导入

import 'package:privacy_screen/privacy_screen.dart';

启用隐私视图

bool result = await PrivacyScreen.instance.enable(
    iosOptions: const PrivacyIosOptions(
        enablePrivacy: true,
        privacyImageName: "LaunchImage",
        autoLockAfterSeconds: 5,
        lockTrigger: IosLockTrigger.didEnterBackground,
    ),
    androidOptions: const PrivacyAndroidOptions(
        enableSecure: true,
        autoLockAfterSeconds: 5,
    ),
    backgroundColor: Colors.white.withOpacity(0),
    blurEffect: PrivacyBlurEffect.extraLight,
);

禁用隐私视图

bool result = await PrivacyScreen.instance.disable();

在iOS上使用自定义图片

  1. 在XCode中打开项目的iOS文件夹,并将图片添加到runner/assets中。
  2. 在代码中指定图片名称:
iosOptions: const PrivacyIosOptions(
    privacyImageName: "LaunchImage",
)

使用锁定功能

PrivacyGate小部件放在根部并提供自己的lockBuilder小部件:

class MyApp extends StatelessWidget {
  MyApp({Key? key}) : super(key: key);
  final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigatorKey,
      builder: (_, child) {
        return PrivacyGate(
          lockBuilder: (ctx) => const LockerPage(),
          navigatorKey: navigatorKey,
          onLifeCycleChanged: (value) => print(value),
          onLock: () => print("onLock"),
          onUnlock: () => print("onUnlock"),
          child: child,
        );
      },
      home: const FirstRoute(),
    );
  }
}

手动锁定和解锁

// 手动锁定
PrivacyScreen.instance.lock();

// 解锁
PrivacyScreen.instance.unlock();

// 暂停自动锁定
PrivacyScreen.instance.pauseLock();

// 恢复自动锁定
PrivacyScreen.instance.resumeLock();

参数说明

共享选项

参数 描述
backgroundColor 隐私视图的背景颜色
blurEffect 根据iOS的模糊效果设置

iOS选项

参数 描述
enablePrivacy 当应用程序进入后台时启用隐私视图
autoLockAfterSeconds 在进入后台后多少秒触发锁定
privacyImageName 要在隐私视图上显示的原生iOS资源名称
lockTrigger 触发锁定机制的原生事件

Android选项

参数 描述
enableSecure 添加FLAG_SECURE以隐藏内容并禁用截屏
autoLockAfterSeconds 在进入后台后多少秒触发锁定

完整示例

以下是一个完整的示例代码,展示了如何集成和使用privacy_screen插件:

import 'package:flutter/material.dart';
import 'package:privacy_screen/privacy_screen.dart';
import 'package:url_launcher/url_launcher.dart';

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

class MyApp extends StatelessWidget {
  MyApp({Key? key}) : super(key: key);
  final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigatorKey,
      builder: (_, child) {
        return PrivacyGate(
          lockBuilder: (ctx) => const LockerPage(),
          navigatorKey: navigatorKey,
          onLifeCycleChanged: (value) => print(value),
          onLock: () => print("onLock"),
          onUnlock: () => print("onUnlock"),
          child: child,
        );
      },
      home: const FirstRoute(),
    );
  }
}

class FirstRoute extends StatefulWidget {
  const FirstRoute({Key? key}) : super(key: key);

  @override
  State<FirstRoute> createState() => _FirstRouteState();
}

class _FirstRouteState extends State<FirstRoute> {
  List<String> lifeCycleHistory = [];

  @override
  void dispose() {
    super.dispose();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: SingleChildScrollView(
        child: SizedBox(
          width: double.infinity,
          child: SafeArea(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: Column(
                children: [
                  ElevatedButton(
                    onPressed: () => launchUrl(Uri.parse("https://www.flutter.dev/")),
                    child: const Text("Test Native: Url Launch"),
                  ),
                  const Divider(),
                  ElevatedButton(
                    onPressed: () async {
                      await PrivacyScreen.instance.enable(
                        iosOptions: const PrivacyIosOptions(
                          enablePrivacy: true,
                          privacyImageName: "LaunchImage",
                          autoLockAfterSeconds: 5,
                          lockTrigger: IosLockTrigger.didEnterBackground,
                        ),
                        androidOptions: const PrivacyAndroidOptions(
                          enableSecure: true,
                          autoLockAfterSeconds: 5,
                        ),
                        backgroundColor: Colors.white.withOpacity(0),
                        blurEffect: PrivacyBlurEffect.extraLight,
                      );
                    },
                    child: const Text("Enable extraLight"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      await PrivacyScreen.instance.enable(
                        iosOptions: const PrivacyIosOptions(
                          enablePrivacy: true,
                          privacyImageName: "LaunchImage",
                          autoLockAfterSeconds: 5,
                          lockTrigger: IosLockTrigger.didEnterBackground,
                        ),
                        androidOptions: const PrivacyAndroidOptions(
                          enableSecure: true,
                          autoLockAfterSeconds: 5,
                        ),
                        backgroundColor: Colors.white.withOpacity(0),
                        blurEffect: PrivacyBlurEffect.light,
                      );
                    },
                    child: const Text("Enable light"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      await PrivacyScreen.instance.enable(
                        iosOptions: const PrivacyIosOptions(
                          enablePrivacy: true,
                          privacyImageName: "LaunchImage",
                          autoLockAfterSeconds: 5,
                          lockTrigger: IosLockTrigger.didEnterBackground,
                        ),
                        androidOptions: const PrivacyAndroidOptions(
                          enableSecure: true,
                          autoLockAfterSeconds: 5,
                        ),
                        backgroundColor: Colors.red.withOpacity(0.4),
                        blurEffect: PrivacyBlurEffect.dark,
                      );
                    },
                    child: const Text("Enable dark"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      await PrivacyScreen.instance.disable();
                    },
                    child: const Text("Disable"),
                  ),
                  const Divider(),
                  ElevatedButton(
                    onPressed: () {
                      PrivacyScreen.instance.lock();
                    },
                    child: const Text("Lock"),
                  ),
                  ElevatedButton(
                    onPressed: () {
                      PrivacyScreen.instance.pauseLock();
                    },
                    child: const Text("Pause Auto Lock"),
                  ),
                  ElevatedButton(
                    onPressed: () {
                      PrivacyScreen.instance.resumeLock();
                    },
                    child: const Text("Resume Auto Lock"),
                  ),
                  const Divider(),
                  ...lifeCycleHistory.map((e) => Text(e)).toList(),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

class LockerPage extends StatelessWidget {
  const LockerPage({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        var result = await showDialog(
          context: context,
          builder: (ctx) => Dialog(
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  const Text(
                    "Confirmation",
                    style: TextStyle(fontSize: 24),
                  ),
                  const Text("Are you sure to unlock?"),
                  Row(
                    children: [
                      Expanded(
                        child: ElevatedButton(
                          onPressed: () {
                            Navigator.of(context).pop(true);
                          },
                          child: const Text('Yes'),
                        ),
                      ),
                      const SizedBox(width: 8.0),
                      Expanded(
                        child: ElevatedButton(
                          onPressed: () {
                            Navigator.of(context).pop(false);
                          },
                          child: const Text('No'),
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        );
        if (result == true) {
          PrivacyScreen.instance.unlock();
        }
        return false;
      },
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              TextFormField(),
              ElevatedButton(
                child: const Text("Unlock"),
                onPressed: () => PrivacyScreen.instance.unlock(),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何使用privacy_screen插件来保护您的Flutter应用程序的隐私。通过这些步骤,您可以轻松地为您的应用添加强大的隐私保护功能。


更多关于Flutter隐私屏幕保护插件privacy_screen的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter隐私屏幕保护插件privacy_screen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用privacy_screen插件的一个基本示例。这个插件允许你启用或禁用设备的屏幕保护(如防窥屏功能),以保护敏感信息不被旁观者看到。

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

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

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

接下来,你可以在你的Flutter项目中使用这个插件。下面是一个简单的示例,展示如何启用和禁用隐私屏幕保护。

示例代码

  1. 主页面(main.dart)
import 'package:flutter/material.dart';
import 'package:privacy_screen/privacy_screen.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Privacy Screen Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PrivacyScreenExample(),
    );
  }
}

class PrivacyScreenExample extends StatefulWidget {
  @override
  _PrivacyScreenExampleState createState() => _PrivacyScreenExampleState();
}

class _PrivacyScreenExampleState extends State<PrivacyScreenExample> {
  bool isPrivacyScreenEnabled = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Privacy Screen Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Privacy Screen is ${isPrivacyScreenEnabled ? "Enabled" : "Disabled"}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                try {
                  bool result = await PrivacyScreen.enable();
                  setState(() {
                    isPrivacyScreenEnabled = result;
                  });
                } catch (e) {
                  print("Error enabling privacy screen: $e");
                }
              },
              child: Text('Enable Privacy Screen'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () async {
                try {
                  bool result = await PrivacyScreen.disable();
                  setState(() {
                    isPrivacyScreenEnabled = !result;
                  });
                } catch (e) {
                  print("Error disabling privacy screen: $e");
                }
              },
              child: Text('Disable Privacy Screen'),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 依赖添加:确保在pubspec.yaml文件中添加privacy_screen依赖,并运行flutter pub get

  2. 状态管理:在PrivacyScreenExample类中,我们使用一个布尔变量isPrivacyScreenEnabled来跟踪隐私屏幕的状态。

  3. 按钮操作:我们有两个按钮,一个用于启用隐私屏幕,另一个用于禁用隐私屏幕。这些按钮分别调用PrivacyScreen.enable()PrivacyScreen.disable()方法,并更新UI以反映当前状态。

  4. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,例如检查设备是否支持隐私屏幕功能。

请注意,privacy_screen插件的功能和可用性可能因设备和操作系统版本而异。确保在发布前进行充分的测试,并查阅插件的官方文档以获取最新的使用指南和兼容性信息。

回到顶部