Flutter安全锁屏插件flag_secure的使用

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

Flutter安全锁屏插件flag_secure的使用

flag_secure

Pub Version

一个用于在运行时管理Android的FLAG_SECURE的Flutter插件。

安装

请查看安装指南。

使用

获取FLAG_SECURE是否已设置

try {
  final bool? isSet = await FlagSecure.isSet;
} on PlatformException {
  // 处理异常
}

设置FLAG_SECURE

try {
  await FlagSecure.set();
} on PlatformException {
  // 处理异常
}

取消FLAG_SECURE

try {
  await FlagSecure.unset();
} on PlatformException {
  // 处理异常
}

示例

以下是一个完整的示例Demo,展示了如何使用该插件。

import 'dart:async';
import 'dart:developer';

import 'package:flag_secure/flag_secure.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.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? _isFlagSecureSet;

  String get _flagSecureLabel {
    if (_isFlagSecureSet == null) {
      return '未知';
    }

    return _isFlagSecureSet! ? '已设置' : '未设置';
  }

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

    _updateIsFlagSecureSet();
  }

  Future<void> _updateIsFlagSecureSet() async {
    bool? isSet;
    try {
      isSet = await FlagSecure.isSet;
    } on PlatformException catch (e) {
      log(e.toString());

      isSet = null;
    }

    if (!mounted) {
      return;
    }

    setState(() {
      _isFlagSecureSet = isSet;
    });
  }

  Future<void> _setFlagSecure() async {
    try {
      await FlagSecure.set();
    } on PlatformException catch (e) {
      log(e.toString());
    }

    await _updateIsFlagSecureSet();
  }

  Future<void> _unsetFlagSecure() async {
    try {
      await FlagSecure.unset();
    } on PlatformException catch (e) {
      log(e.toString());
    }

    await _updateIsFlagSecureSet();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('flag_secure 示例应用'),
        ),
        body: SingleChildScrollView(
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('FLAG_SECURE: $_flagSecureLabel'),
                const Padding(padding: EdgeInsets.symmetric(vertical: 16.0)),
                FilledButton(
                  onPressed: _setFlagSecure,
                  child: const Text('设置'),
                ),
                FilledButton(
                  onPressed: _unsetFlagSecure,
                  child: const Text('取消设置'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter安全锁屏插件flag_secure的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全锁屏插件flag_secure的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想确保你的应用内容在锁屏或最近任务列表中不被窥视,你可以使用Android原生的FLAG_SECURE标志。这个标志可以防止屏幕内容被截图或显示在设备的最近任务列表中。虽然Flutter本身没有直接提供这个功能的API,但你可以通过平台通道(Platform Channel)与原生Android代码进行交互来实现这一点。

以下是一个如何在Flutter中使用FLAG_SECURE的示例代码:

1. 创建Flutter插件

首先,你需要创建一个Flutter插件来封装Android的原生代码。如果你还没有Flutter插件,可以使用以下命令创建一个新的插件:

flutter create --org com.example --template=plugin secure_screen

2. 在Android平台上实现FLAG_SECURE

编辑secure_screen/android/src/main/java/com/example/securescreen/SecureScreenPlugin.java文件,添加设置FLAG_SECURE的逻辑:

package com.example.securescreen;

import android.app.Activity;
import android.view.WindowManager;

import androidx.annotation.NonNull;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

public class SecureScreenPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
    private MethodChannel channel;
    private Activity activity;

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "secure_screen");
        channel.setMethodCallHandler(this);
    }

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        if (call.method.equals("enableSecureFlag")) {
            if (activity != null) {
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
                result.success(true);
            } else {
                result.error("UNAVAILABLE", "Activity is not available", null);
            }
        } else {
            result.notImplemented();
        }
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        channel.setMethodCallHandler(null);
    }

    @Override
    public void onAttachedToActivity(ActivityPluginBinding binding) {
        activity = binding.getActivity();
    }

    @Override
    public void onDetachedFromActivityForConfigChanges() {
        activity = null;
    }

    @Override
    public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
        activity = binding.getActivity();
    }

    @Override
    public void onDetachedFromActivity() {
        activity = null;
    }
}

3. 在Flutter中调用插件

在你的Flutter项目中,你可以通过创建一个Dart类来调用这个插件。首先,确保你的pubspec.yaml文件中已经声明了这个插件:

dependencies:
  flutter:
    sdk: flutter
  secure_screen:
    path: ./path/to/secure_screen  # 这里替换成你的插件路径

然后,在你的Dart代码中,你可以这样使用它:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Secure Screen Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                bool success = await SecureScreen.enableSecureFlag();
                if (success) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Secure flag enabled')),
                  );
                } else {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Failed to enable secure flag')),
                  );
                }
              } catch (e) {
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Error: $e')),
                );
              }
            },
            child: Text('Enable Secure Flag'),
          ),
        ),
      ),
    );
  }
}

请注意,上面的Dart代码假设你的插件提供了一个enableSecureFlag方法。你可能需要在你的插件的Dart接口文件中定义这个方法。

4. 插件的Dart接口

secure_screen/lib/secure_screen.dart文件中定义插件的接口:

import 'package:flutter/services.dart';

class SecureScreen {
  static const MethodChannel _channel = MethodChannel('secure_screen');

  static Future<bool> enableSecureFlag() async {
    final bool result = await _channel.invokeMethod('enableSecureFlag');
    return result;
  }
}

这样,你就可以在Flutter应用中安全地启用FLAG_SECURE了。这个设置将确保你的应用内容在锁屏或最近任务列表中不会被窥视。

回到顶部