Flutter音量控制插件volumedeck_flutter的使用

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

Flutter音量控制插件volumedeck_flutter的使用

概述

Volumedeck提供了基于GPS速度的自动音量调节功能,旨在改善车辆和公共交通工具中的媒体收听体验。

关键特性

  • 基于速度的音量调整:根据车辆的速度自动调整音频音量,以保持一致的音量水平。
  • 增强的安全性和专注度:消除了手动调整音量的需求,增强了驾驶员的安全性和乘客的便利性。
  • 高效且可靠:实时基于速度的音量控制,确保平滑且不间断的收听体验。
  • 易于集成:用户友好的API和全面的文档,便于实现。
  • 多样化的应用:增强导航、音乐流媒体和音频内容交付应用程序在各种车辆和公共交通工具中的使用。
  • 与硬件音量键无缝集成:统一的音量控制与Volumedeck的调整同步。
  • 与UniversalVolume轻松集成:统一的音量控制。
  • 无需互联网连接

开始使用

首先配置您的Android和iOS项目以获取必要的权限。

配置Volumedeck

首先需要为您的Android和iOS项目配置必要的权限。

使用指南

初始化Volumedeck

Volumedeck.initialize(
    runInBackground: true, 
    autoStart: true, // 如果不想在初始化时启动Volumedeck,请设置为false
    locationServicesStatusChange: (bool status) {
      // 获取位置开关状态更新
    },
    onLocationUpdate: (speed, volume) {
      // 速度和音量变化的更新
    },
    onStart: () {
      // Volumedeck成功启动
    },
    onStop: () {
      // Volumedeck停止,可能是从stop方法或安卓通知
    },
);

启动Volumedeck

默认情况下,Volumedeck会在初始化时自动启动,因此无需显式调用start()方法。

await Volumedeck.start();

停止Volumedeck

Volumedeck.stop();

API参考

您可以在这里找到API参考:API参考

免费使用

Volumedeck SDK免费提供给个人和商业项目使用,具有完整功能且无时间限制。但是,在使用免费版本时,运行时会显示水印。严格禁止隐藏、移除或修改Volumedeck SDK免费版本中的水印。

激活密钥和水印移除

要从您的应用中移除水印,可以通过购买激活密钥来获得无水印版本的Volumedeck SDK。

您需要为每个平台设置不同的激活密钥。

如需购买激活密钥或有关许可和使用的任何其他问题,请联系我们:team@navideck.com。我们随时为您提供帮助并提供所需信息。

联系方式

如有任何疑问、问题或需要支持,请随时联系我们的团队:team@navideck.com。感谢您选择Volumedeck Flutter插件!


示例代码

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

// ignore_for_file: avoid_print

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:volumedeck_flutter/volumedeck_flutter.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> {
  late Volumedeck volumedeck;

  bool isLocationOn = false;
  bool isStarted = false;
  double speed = 0.0;
  double mockSpeed = 0.0;
  double volume = 0.0;

  Future<bool> hasPermissions() async {
    if (!Platform.isAndroid) return true;

    var locationPermission = await Permission.location.request();
    if (locationPermission.isDenied) return false;
    var notificationPermission = await Permission.notification.request();
    return notificationPermission.isGranted;
  }

  void initializeVolumedeck() async {
    if (!await hasPermissions()) {
      print("Failed to get permissions");
      return;
    }
    var androidActivationKey =
        "on2aKTfiM49rTLylSV04gOpVRVLmZ3RQuJXeQRLCWCmunUbAS1fxcS6PpMNqTJmwgmANPB9Z5bDIIce-evrnTWvksYedUeXqRfjTCgouF08ATaSMlh47i0zOlwuVbESZ2a9UIj0a5jyDpX6ZhKsJGSgaGVPmvBa_Aj2bkGTE4VTf4VQZ49b3FiYcnCeL5kMSDemQxIwCX_a5uvbSF11LQoDEIF-GXAwwxUD9ev7FHUaKUyrZhr2RexPpchJ4G53ivyYITi0YSTmtVb5uN0sAvWwae09USyZZDoIn_B3regLCjgL1g5j_U2jaL5Kvba5QsgY1QqYR40Jt2NesCkP_krbx2kZ3eXe4nmZlpO5jAeGdcsCpd5AAn6q0HIKCVb0fi_ZD5C4FEjfVkwawwa6TH-V5BXddJM6Y8YEIf2mpqeagu-faPsEhunsaHvFF5eIx8JkH4AhzuucQAeVI_zMGiTfD6BBBzksKYfCvx7BlIKnRB6VAxvoXCkloeOh772Gu11D83sXf0jEHhXyd6Pps06Zdf5y5_cJIt46XC4Yl4g4Rt4qIj40pZfK19PeL2QCmhDfI6dSXBlm9czkPnSnzafDS2rOx1x7cz8Ci16KlgASbXoAjW7Xmh61eS5jlVFJoT8QDRdFJZOnNDBM5Noh-jA47t1BUb_Wd1M0NWjCvRzQ";
    var iOSActivationKey =
        "bsYZ-aE4j4HPLp4BiqY21s1mUsOvuqHKnaqSb__n9WEWm4QqXDG8sY2dhfds38XAOs_4jj_xFj464f586jy3EnXTc6RUrb_eVscIJGgKNcrGEJQlST5WGUZDbcE6bWKpcrjVIfphaiggvDTKqm9ahcs47E6OfHOeAf2t82rx0mVVqoeMjdEp5UrZk14H64db0ayljEfB_2oR7pRkx0GblIc96QC8KiylDiq0MKiXpDFVrTCchbxSz2Um0aAQPdsOP0un6UPspKoPTFu5CcCzWWe_iLIYxUVqdgpTWhgz2NyExoi7RwQJ70q2HpBMf_Cpy3qdZcdJj604NdzPy6YWiQyCT_rT_ZkbXiKZDBSutCSm9TPha1TKg466RfKLgrhYEDAW5XW4ooJRY9r4PR_-Ly39W-9Qh5TF-Jg6lzMfft5HH6qtp-JnmLIc4xw0HzPMb6QtwcB3F11NBudq5WsLt64kD6JGbnhEi3RE5PYTzGE0nOyQo3vGybas9SQl6XrEHGmgMjaW2om4qLIDsiKc1XYkjFKEFq6dSoYru0TfwhqescYbLW4Z2jN8WtlGpxvqwF8-eNHGVxH0YF2B-GhogTp_cxVx0jSs6TFblgSv7cwZmuMlAvyHx5CLsUuhXM0cE8nSshqxTHb9x1CJS0H5iocpYMefcHHpLN_GWc86N70";

    await Volumedeck.initialize(
      androidActivationKey: androidActivationKey,
      iOSActivationKey: iOSActivationKey,
      runInBackground: true,
      autoStart: false,
      androidConfig: AndroidConfig(
        notificationTitle: "Volumedeck is running in background",
        notificationStopButtonText: "Stop Volumedeck",
        showStopButtonInNotification: true,
        notificationSubtitle: "Speed -> %s m/s | Volume -> %s ",
        notificationIconDrawable: "notification_icon",
      ),
      locationServicesStatusChange: (bool status) {
        setState(() => isLocationOn = status);
      },
      onStart: () {
        setState(() => isStarted = true);
      },
      onStop: () {
        setState(() => isStarted = false);
      },
      onLocationUpdate: (s, v) {
        setState(() {
          speed = s;
          volume = v;
        });
      },
    );
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
          appBar: AppBar(
            title: const Text('Volumedeck'),
            centerTitle: true,
            leading: Icon(
              isLocationOn ? Icons.location_on : Icons.location_off,
            ),
            actions: [
              Icon(
                Icons.circle,
                color: isStarted ? Colors.green : Colors.red,
              ),
              const SizedBox(width: 10)
            ],
          ),
          body: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      try {
                        await Volumedeck.start();
                      } on PlatformException catch (e) {
                        print("Error: ${e.message}");
                      }
                    },
                    child: const Text("Start"),
                  ),
                  ElevatedButton(
                    onPressed: () {
                      Volumedeck.stop();
                    },
                    child: const Text("Stop"),
                  ),
                ],
              ),
              const Divider(),
              ListTile(
                title: const Text("Speed"),
                trailing: Text(speed.toString()),
              ),
              ListTile(
                title: const Text("Volume"),
                trailing: Text(volume.toString()),
              ),
              const Divider(),
              const Padding(
                padding: EdgeInsets.only(left: 18.0),
                child: Text("Mock Speed"),
              ),
              Slider(
                min: 0,
                max: 50,
                value: mockSpeed,
                onChanged: (value) {
                  Volumedeck.setMockSpeed(value.toInt());
                  setState(() {
                    mockSpeed = value;
                  });
                },
              )
            ],
          )),
    );
  }
}

更多关于Flutter音量控制插件volumedeck_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音量控制插件volumedeck_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用volumedeck_flutter插件的一个示例。这个插件通常用于控制设备的音量。请注意,volumedeck_flutter可能不是一个官方或广泛认知的插件,但假设它提供了类似的功能,我们可以模拟一个典型的音量控制插件的使用方法。如果插件的具体API有所不同,请参考其官方文档进行调整。

步骤 1: 添加依赖

首先,在你的pubspec.yaml文件中添加volumedeck_flutter(或相应插件)的依赖。

dependencies:
  flutter:
    sdk: flutter
  volumedeck_flutter: ^x.y.z  # 替换为实际的版本号

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

步骤 2: 导入插件

在你的Dart文件中导入该插件。

import 'package:volumedeck_flutter/volumedeck_flutter.dart';

步骤 3: 使用插件

下面是一个简单的示例,展示如何使用该插件来获取和设置系统音量。

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

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

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

class _MyAppState extends State<MyApp> {
  double _currentVolume = 0.0;

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

  Future<void> _getSystemVolume() async {
    try {
      double volume = await VolumeDeckFlutter.getSystemVolume();
      setState(() {
        _currentVolume = volume;
      });
    } catch (e) {
      print('Error getting system volume: $e');
    }
  }

  Future<void> _setSystemVolume(double volume) async {
    try {
      await VolumeDeckFlutter.setSystemVolume(volume);
      setState(() {
        _currentVolume = volume;
      });
    } catch (e) {
      print('Error setting system volume: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Volume Control'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Current Volume: $_currentVolume',
                style: TextStyle(fontSize: 24),
              ),
              Slider(
                value: _currentVolume,
                min: 0.0,
                max: 1.0,
                onChanged: (double newValue) {
                  setState(() {
                    _currentVolume = newValue;
                  });
                  _setSystemVolume(newValue);
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml中添加插件依赖。
  2. 导入插件:在Dart文件中导入volumedeck_flutter
  3. 获取系统音量:使用VolumeDeckFlutter.getSystemVolume()方法来获取当前系统音量,并在UI中显示。
  4. 设置系统音量:使用VolumeDeckFlutter.setSystemVolume(double volume)方法来设置新的系统音量,并更新UI。
  5. UI组件:使用Slider组件来允许用户调整音量,并在滑块值改变时调用设置音量的方法。

请注意,实际的API调用可能会根据插件的实现有所不同。如果volumedeck_flutter插件的具体API与上述示例不符,请参考其官方文档进行调整。如果插件不存在或API不同,你可能需要寻找一个类似的音量控制插件,如flutter_sound或其他社区提供的解决方案。

回到顶部