Flutter安卓系统构建信息查询插件android_os_build的使用

Flutter 安卓系统构建信息查询插件 android_os_build 的使用

示例代码

import 'dart:convert';

import 'package:android_os_build/android_os_build.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

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

  // 这个小部件是你的应用的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Android OS 构建信息',
      theme: ThemeData.light(),
      darkTheme: ThemeData.dark(),
      home: const MyHomePage(title: 'Android OS 构建信息'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // 这个小部件是你的应用的主页面。它是一个有状态的小部件,意味着
  // 它有一个 State 对象(定义在下面)包含影响其外观的字段。
  // 这个类是状态的配置。它保存了由父级(在这个例子中是 App 小部件)提供的值(在这个例子中是标题),
  // 并且被 State.build 方法使用。Widget 子类中的字段总是标记为 "final"。

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          IconButton(
            onPressed: () async {
              final result = JsonEncoder.withIndent(' ' * 4).convert(
                  buildMapping.map<String, String>((k, v) => MapEntry(k, v())));
              await Clipboard.setData(ClipboardData(text: result));
              if (!context.mounted) return;
              ScaffoldMessenger.of(context).clearSnackBars();
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: const Text('已复制!'),
                  action: SnackBarAction(label: '确定', onPressed: () {}),
                ),
              );
            },
            icon: const Icon(Icons.copy_all_rounded),
          ),
        ],
      ),
      body: ListTileTheme(
        data: ListTileThemeData(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(12),
            side: BorderSide(
              color: Theme.of(context).colorScheme.outlineVariant,
            ),
          ),
          contentPadding: const EdgeInsets.only(left: 16),
        ),
        child: ListView.separated(
          padding: const EdgeInsets.all(16),
          separatorBuilder: (context, index) => const SizedBox(height: 8),
          itemBuilder: (context, index) {
            final key = buildMapping.keys.elementAt(index);
            final value = buildMapping[key]!();
            return ListTile(
              title: Text(key),
              subtitle: Text(value),
              trailing: IconButton(
                onPressed: () async {
                  await Clipboard.setData(ClipboardData(text: value));
                  if (!context.mounted) return;
                  ScaffoldMessenger.of(context).clearSnackBars();
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(
                      content: const Text('已复制!'),
                      action: SnackBarAction(label: '确定', onPressed: () {}),
                    ),
                  );
                },
                icon: const Icon(Icons.copy_rounded),
              ),
            );
          },
          itemCount: buildMapping.length,
        ),
      ),
    );
  }

  final buildMapping = <String, String Function()>{
    'board': () => Build.board,
    'bootloader': () => Build.bootloader,
    'brand': () => Build.brand,
    'device': () => Build.device,
    'display': () => Build.display,
    'fingerprint': () => Build.fingerprint,
    'hardware': () => Build.hardware,
    'host': () => Build.host,
    'id': () => Build.id,
    'manufacturer': () => Build.manufacturer,
    'model': () => Build.model,
    'odmSku': () => Build.odmSku,
    'product': () => Build.product,
    'sku': () => Build.sku,
    'socManufacturer': () => Build.socManufacturer,
    'socModel': () => Build.socModel,
    'supported32BitAbis': () => Build.supported32BitAbis.join(','),
    'supported64BitAbis': () => Build.supported64BitAbis.join(','),
    'supportedAbis': () => Build.supportedAbis.join(','),
    'tags': () => Build.tags,
    'time': () => Build.time.toIso8601String(),
    'type': () => Build.type,
    'user': () => Build.user,
    'getRadioVersion': () => Build.getRadioVersion(),
    'getSerial': () => Build.getSerial(),
    'getFingerprintedPartition': () =>
        Build.getFingerprintedPartitions().map((e) => e.fingerprint).join(','),
    'baseOs': () => Build.version.baseOs,
    'codename': () => Build.version.codename,
    'incremental': () => Build.version.incremental,
    'mediaPerformanceClass': () => Build.version.mediaPerformanceClass.toString(),
    'previewSdkInt': () => Build.version.previewSdkInt.toString(),
    'release': () => Build.version.release,
    'releaseOrCodename': () => Build.version.releaseOrCodename ?? '',
    'releaseOrPreviewDisplay': () => Build.version.releaseOrPreviewDisplay ?? '',
    'sdkInt': () => Build.version.sdkInt.toString(),
    'securityPatch': () => Build.version.securityPatch,
  };
}

重要说明

这个包目前是实验性的,可能会在未来以不破坏现有功能的方式进行更改。版本 0.X.X 仍在开发中,可能不适合生产环境使用。

示例安装

运行以下命令来安装示例应用:

cd example
flutter pub get
flutter build apk --target-platform android-arm64
flutter install --release

使用方法

添加包
  1. 在命令行中运行以下命令:

    flutter pub add android_os_build
    
  2. 或者在 pubspec.yaml 文件中添加:

    ...
    dependencies:
      android_os_build: any
    ...
    
获取构建信息
import 'package:android_os_build/android_os_build.dart';

final model = Build.model;
final sdkInt = Build.version.sdkInt;

注意:AndroidBuild.getSerial() 需要 android.permission.READ_PRIVILEGED_PHONE_STATE 权限。如果你想要获取序列号,你需要将此权限添加到你的 AndroidManifest.xml 文件中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
  ......
</manifest>
直接使用生成的 FFI 代码
import 'package:android_os_build/android_os_build_jni.dart';

String getBoard() {
  final JString board = Build.BOARD;
  /// 返回值并释放字符串对象
  return board.toDartString(releaseOriginal: true);
}

开发

你应该先构建 APK 然后运行 jnigen

cd example
flutter build apk
cd ..
flutter pub run jnigen --config jnigen.yaml

更多关于Flutter安卓系统构建信息查询插件android_os_build的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安卓系统构建信息查询插件android_os_build的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


android_os_build 是一个 Flutter 插件,用于查询 Android 设备上的构建信息,如设备型号、制造商、系统版本、硬件信息等。这个插件可以帮助开发者在 Flutter 应用中获取 Android 设备的硬件和系统相关的详细信息。

以下是如何在 Flutter 项目中使用 android_os_build 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 android_os_build 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  android_os_build: ^0.1.0  # 请使用最新版本

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

2. 导入插件

在需要使用插件的 Dart 文件中导入 android_os_build

import 'package:android_os_build/android_os_build.dart';

3. 使用插件获取构建信息

你可以使用 AndroidOsBuild 类提供的方法来获取 Android 设备的构建信息。以下是一些常用的方法:

  • 获取设备型号:

    String model = await AndroidOsBuild.model;
    print('Device Model: $model');
    
  • 获取设备制造商:

    String manufacturer = await AndroidOsBuild.manufacturer;
    print('Manufacturer: $manufacturer');
    
  • 获取系统版本:

    String release = await AndroidOsBuild.release;
    print('Android Version: $release');
    
  • 获取 SDK 版本:

    int sdkInt = await AndroidOsBuild.sdkInt;
    print('SDK Version: $sdkInt');
    
  • 获取设备硬件信息:

    String hardware = await AndroidOsBuild.hardware;
    print('Hardware: $hardware');
    

4. 示例代码

以下是一个完整的示例,展示如何获取并打印 Android 设备的构建信息:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Android OS Build Info'),
        ),
        body: Center(
          child: BuildInfoDisplay(),
        ),
      ),
    );
  }
}

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

class _BuildInfoDisplayState extends State<BuildInfoDisplay> {
  String model = 'Unknown';
  String manufacturer = 'Unknown';
  String release = 'Unknown';
  int sdkInt = 0;
  String hardware = 'Unknown';

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

  Future<void> loadBuildInfo() async {
    String deviceModel = await AndroidOsBuild.model;
    String deviceManufacturer = await AndroidOsBuild.manufacturer;
    String androidVersion = await AndroidOsBuild.release;
    int androidSdkVersion = await AndroidOsBuild.sdkInt;
    String deviceHardware = await AndroidOsBuild.hardware;

    setState(() {
      model = deviceModel;
      manufacturer = deviceManufacturer;
      release = androidVersion;
      sdkInt = androidSdkVersion;
      hardware = deviceHardware;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Device Model: $model'),
        Text('Manufacturer: $manufacturer'),
        Text('Android Version: $release'),
        Text('SDK Version: $sdkInt'),
        Text('Hardware: $hardware'),
      ],
    );
  }
}
回到顶部