Flutter谷歌投屏插件googlecast的使用

Flutter谷歌投屏插件googlecast的使用

简介

googlecast 是一个用于连接到仅支持音频的 Chromecast 设备(例如 Google Nest Mini)的 Flutter 插件。

特性

  • 加载媒体
  • 播放媒体
  • 暂停媒体
  • 停止媒体

平台支持

  • Android
  • iOS (尚未支持)
  • Web (尚未支持)

入门指南

第一步:添加依赖项

在你的 build.gradle 文件中添加以下依赖项:

implementation 'com.google.android.gms:play-services-cast-framework:21.0.1'
implementation 'com.google.android.exoplayer:extension-cast:2.11.5'

第二步:创建 CastOptionsProvider

在你的 Android 项目中创建一个 CastOptionsProvider 类:

import android.content.Context;
import com.google.android.gms.cast.framework.CastOptions;
import com.google.android.gms.cast.framework.OptionsProvider;
import com.google.android.gms.cast.framework.SessionProvider;   
import java.util.ArrayList;
import java.util.List;

public class CastOptionsProvider implements OptionsProvider {
    private String app_id="CC1AD845";
    public static final String CUSTOM_NAMESPACE = "urn:x-cast:radio_fm_am";

    @Override
    public CastOptions getCastOptions(Context context) {
        List<String> supportedNamespaces = new ArrayList<>();
        supportedNamespaces.add(CUSTOM_NAMESPACE);
        CastOptions castOptions = new CastOptions.Builder()
                .setReceiverApplicationId(app_id)
                //.setSupportedNamespaces(supportedNamespaces)
                .build();
        return castOptions;
    }

    @Override
    public List<SessionProvider> getAdditionalSessionProviders(Context context) {
        return null;
    }
}

注意:“CC1AD845” 是默认的 Media Receiver 应用程序 ID。如果你想获取自定义的应用程序 ID,可以查看 Google Cast SDK 文档来设置它。

第三步:修改 MainActivity

在你的项目中打开 MainActivity 并导入以下内容:

import com.google.android.gms.cast.framework.CastContext;
import io.flutter.embedding.android.FlutterFragmentActivity;

第四步:使 MainActivity 继承 FlutterFragmentActivity

第五步:配置 Flutter 引擎

MainActivity 中添加以下代码:

@Override
public void configureFlutterEngine(FlutterEngine flutterEngine){
    CastContext.getSharedInstance(getApplicationContext());
}

第六步:添加 CastOptionsProviderAndroidManifest.xml

在你的 AndroidManifest.xml 文件中添加以下代码:

<meta-data
    android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
    android:value="com.radiofm.freeradio.CastOptionsProvider" />

注意:将 value 更改为 CastOptionsProvider 的位置。

使用方法

第一步:导入 googlecast

在你的 Dart 文件中导入 googlecast 包:

import 'package:googlecast/googlecast.dart';

第二步:创建 CastController

创建一个 CastController 实例:

CastController castController = new CastController();

第三步:设置媒体项

使用 setMedia 方法设置媒体项:

await castController.setMedia(url: music_url, title: title, subtitle: subtitle);

注意:subtitle 可以为 null

第四步:加载媒体

使用 loadAudio 方法加载媒体:

await castController.loadAudio();

第五步:播放媒体

使用 play 方法播放媒体:

await castController.play();

第六步:暂停媒体

使用 pause 方法暂停媒体:

await castController.pause();

第七步:停止媒体

使用 stop 方法停止媒体:

await castController.stop();

第八步:添加 Chromecast 按钮

在你的 UI 中添加 Chromecast 按钮:

GoogleCastButton(size: 35);

第九步:监听 Chromecast 连接状态

监听 Chromecast 连接状态:

GoogleChromeCast().connectionState.listen((event) async {
    if (event != null) {
        print("$event");
        if (event) {
            // 连接成功
        } else {
            // 连接失败
        }
    }
});

注意:返回 true 表示已连接,否则表示未连接。

第十步:监听 Chromecast 状态

监听 Chromecast 状态变化:

GoogleChromeCast().messageStream.listen((message) {
    if (message != null) {
        print("$message");
        if (message == "PLAYING") {
            // 媒体正在播放
        } else if (message == "IDLE") {
            // 媒体闲置
        } else if (message == "BUFFERING") {
            // 媒体缓冲
        } else if (message == "LOADING") {
            // 媒体加载中
        } else if (message == "PAUSED") {
            // 媒体暂停
        } else if (message == "UNKNOWN") {
            // 未知状态
        } else if (message == "ERROR") {
            // 出错
        }
    }
});

示例代码

以下是完整的示例代码:

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

import 'package:flutter/services.dart';
import 'package:googlecast/googlecast.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

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

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
    String platformVersion;
    // Platform messages may fail, so we use a try/catch PlatformException.
    // We also handle the message potentially returning null.
    try {
      platformVersion =
          await Googlecast.platformVersion ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Text('Running on: $_platformVersion\n'),
        ),
      ),
    );
  }
}

更多关于Flutter谷歌投屏插件googlecast的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,关于Flutter中的Google Cast插件的使用,以下是一个基本的代码示例,展示如何集成和使用Google Cast插件进行投屏操作。这个示例假定你已经有一个Flutter项目,并且已经添加了google_castgoogle_cast_flutter依赖。

首先,确保在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  google_cast: ^0.x.x  # 请检查最新版本号
  google_cast_flutter: ^0.x.x  # 请检查最新版本号

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

接下来,配置你的Flutter应用以使用Google Cast。以下是一个基本的实现步骤:

  1. 初始化Google Cast会话

在你的main.dart文件中,添加以下代码来初始化Google Cast会话:

import 'package:flutter/material.dart';
import 'package:google_cast/google_cast.dart';
import 'package:google_cast_flutter/google_cast_flutter.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Google Cast Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CastScreen(),
    );
  }
}

class CastScreen extends StatefulWidget {
  @override
  _CastScreenState createState() => _CastScreenState();
}

class _CastScreenState extends State<CastScreen> with WidgetsBindingObserver {
  CastSession? _castSession;
  CastController? _castController;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance!.addObserver(this);
    _initializeCast();
  }

  @override
  void dispose() {
    WidgetsBinding.instance!.removeObserver(this);
    _castController?.dispose();
    super.dispose();
  }

  Future<void> _initializeCast() async {
    // Initialize Cast framework
    await cast.initialize();

    // Listen for session updates
    cast.sessionManager.sessionUpdated.listen((CastSession session) {
      setState(() {
        _castSession = session;
      });
      if (session.isConnected) {
        _castController = session.remoteMediaClient?.mediaController;
      }
    });

    // Start device discovery
    await cast.sessionManager.startDiscovery();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Cast Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: _castSession == null || !_castSession!.isConnected
            ? _buildDevicePicker()
            : _buildCastControls(),
      ),
    );
  }

  Widget _buildDevicePicker() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('No device connected'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            final CastDevice? device = await cast.deviceManager.selectDevice();
            if (device != null) {
              await cast.sessionManager.connectToSession(device.sessionId);
            }
          },
          child: Text('Select Device'),
        ),
      ],
    );
  }

  Widget _buildCastControls() {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Connected to ${_castSession!.castDevice.friendlyName}'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            if (_castController != null) {
              await _castController!.loadMedia(
                MediaInfo(
                  contentId: 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4',
                  contentType: 'video/mp4',
                  metadata: MediaMetadata(
                    title: 'Big Buck Bunny',
                    images: [
                      MediaImage(
                        url: 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg',
                      ),
                    ],
                  ),
                ),
              );
              await _castController!.play();
            }
          },
          child: Text('Play Video'),
        ),
      ],
    );
  }
}
  1. 运行应用

确保你的设备和投屏目标(如Chromecast)在同一个网络上,然后运行你的Flutter应用。你应该能够看到一个设备选择器按钮,点击它可以选择投屏设备。一旦设备连接成功,你将看到一个播放按钮,点击它可以开始播放视频。

这个示例展示了基本的Google Cast集成,包括设备发现和媒体播放控制。你可以根据需求进一步扩展功能,比如添加暂停、停止、音量控制等。

注意:实际应用中,请确保遵守Google Cast的使用条款和政策,以及处理用户隐私和数据安全的相关要求。

回到顶部