Flutter投屏框架插件flutter_cast_framework_v2的使用

Flutter投屏框架插件flutter_cast_framework_v2的使用

概述

Flutter Cast Framework 是一个实验性的 Flutter 插件,允许您在 Flutter 应用程序中使用 Chromecast API。通过此插件,您可以实现投屏功能,包括播放、暂停、停止媒体,以及扩展控制等功能。

使用指南

添加依赖

首先,克隆此仓库并在您的 pubspec.yaml 文件中添加以下依赖项:

dependencies:
  flutter_cast_framework:
    path: ../flutter_cast_framework/ # 根据您克隆的路径调整
Android 设置
1. 创建 CastOptionsProvider

在您的 Android 项目中添加以下类:

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

class CastOptionsProvider : OptionsProvider {
    override fun getCastOptions(context: Context): CastOptions {
        return CastOptions.Builder()
                .setReceiverApplicationId("4F8B3483") // 替换为您的接收器应用 ID
                .build()
    }

    override fun getAdditionalSessionProviders(context: Context): List<SessionProvider>? {
        return null
    }
}
2. 加载 CastOptionsProvider

AndroidManifest.xml 文件的 <application> 标签中添加以下条目以引用 CastOptionsProvider 类:

<application>
    <meta-data
        android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.gianlucaparadise.flutter_cast_framework_example.CastOptionsProvider" />
</application>
3. 主题设置

确保您的应用程序和活动使用了 AppCompat 主题(详见 这里)。

iOS 设置
1. 最低 iOS 版本

确保最低 iOS 版本为 10.0。 在 Xcode 中,选择左侧的 Runner,然后转到 General > Deployment Info > Target,将版本设置为 10.0 或更高。

2. 安装 iOS 依赖

关闭 Xcode 后,在项目的根目录打开终端并运行以下命令:

cd ios && pod install
3. 在 Xcode 中打开项目

从项目的根目录运行以下命令以使用 Xcode 打开 Flutter 项目:

open ios/Runner.xcworkspace
4. Chromecast SDK 设置

在您的 AppDelegate.swift 文件中添加以下代码:

import UIKit
import Flutter
+import GoogleCast

@UIApplicationMain
-@objc class AppDelegate: FlutterAppDelegate {
+@objc class AppDelegate: FlutterAppDelegate, GCKLoggerDelegate {
+  let kReceiverAppID = "4F8B3483" // 替换为您的接收器应用 ID
+  let kDebugLoggingEnabled = true
+  
   override func application(
     _ application: UIApplication,
     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
   ) -> Bool {
+    let criteria = GCKDiscoveryCriteria(applicationID: kReceiverAppID)
+    let options = GCKCastOptions(discoveryCriteria: criteria)
+    GCKCastContext.setSharedInstance(with: options)
+
+    // 启用日志记录。
+    GCKLogger.sharedInstance().delegate = self
+    
     GeneratedPluginRegistrant.register(with: self)
     return super.application(application, didFinishLaunchingWithOptions: launchOptions)
   }
+  
+  // MARK: - GCKLoggerDelegate
+  
+  func logMessage(_ message: String,
+                  at level: GCKLoggerLevel,
+                  fromFunction function: String,
+                  location: String) {
+      if (kDebugLoggingEnabled) {
+          print(function + " - " + message)
+      }
+  }
 }

技术说明

该项目用于测试以下技术的能力:

  • Chromecast API(发送器 - Android SDK)
  • Flutter
  • Flutter 自定义平台特定代码

路线图

接下来要开发的功能包括:

  • 扩展控件中的 CC(iOS)
  • 扩展控件的美化(进度条广告、全屏、进度条句柄)
  • MiniController 和 扩展控件中的标题(由于 pigeon issue 被阻塞)
  • 处理队列
  • 处理进度拖动
  • 确定是否应使用流而不是监听器进行重构
  • 添加测试

示例代码

以下是一个简单的示例代码,展示如何在 Flutter 应用程序中使用 flutter_cast_framework_v2

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Cast Framework Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final castFramework = FlutterCastFramework();
              await castFramework.connect();
              print('Connected to Chromecast!');
            },
            child: Text('Connect to Chromecast'),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


flutter_cast_framework_v2 是一个用于在 Flutter 应用中实现投屏功能的插件,支持 Google Cast(Chromecast)等投屏设备。通过这个插件,你可以轻松地将媒体内容投屏到支持 Google Cast 的设备上。

1. 安装插件

首先,你需要在 pubspec.yaml 文件中添加 flutter_cast_framework_v2 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_cast_framework_v2: ^latest_version

然后运行 flutter pub get 来安装插件。

2. 配置 Android 和 iOS 项目

Android

android/app/src/main/AndroidManifest.xml 文件中,添加以下权限和元数据:

<uses-permission android:name="android.permission.INTERNET" />

<application>
    <meta-data
        android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.android.gms.cast.framework.options.SessionProvider" />
</application>

iOS

ios/Runner/Info.plist 文件中,添加以下键值对:

<key>NSLocalNetworkUsageDescription</key>
<string>We need access to your local network to discover Cast devices.</string>
<key>NSBonjourServices</key>
<array>
    <string>_googlecast._tcp</string>
</array>

3. 初始化 CastContext

在你的 Flutter 应用中,首先需要初始化 CastContext。通常,你可以在应用启动时进行初始化。

import 'package:flutter_cast_framework_v2/flutter_cast_framework.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await CastContext.initialize();
  
  runApp(MyApp());
}

4. 添加 Cast 按钮

你可以在应用的 UI 中添加一个 Cast 按钮,用户可以通过这个按钮选择投屏设备。

import 'package:flutter/material.dart';
import 'package:flutter_cast_framework_v2/flutter_cast_framework.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Cast Demo'),
        actions: [
          CastButton(),
        ],
      ),
      body: Center(
        child: Text('Press the Cast button to start casting.'),
      ),
    );
  }
}

5. 投屏媒体内容

你可以使用 CastSessionManager 来控制媒体内容的投屏。以下是一个简单的示例,展示如何投屏一个视频:

import 'package:flutter_cast_framework_v2/flutter_cast_framework.dart';

void castVideo(String videoUrl) async {
  final sessionManager = CastSessionManager.instance;
  final castSession = await sessionManager.startSession();

  if (castSession != null) {
    await castSession.loadMedia(
      MediaInfo(
        contentId: videoUrl,
        contentType: 'video/mp4',
        streamType: StreamType.buffered,
      ),
    );
  }
}

6. 处理 Cast 会话状态

你可以监听 Cast 会话的状态变化,以便在用户连接或断开投屏设备时做出相应的反应。

import 'package:flutter_cast_framework_v2/flutter_cast_framework.dart';

void listenToCastSession() {
  CastSessionManager.instance.addListener(() {
    final castSession = CastSessionManager.instance.currentSession;
    if (castSession != null) {
      print('Connected to Cast device: ${castSession.device.friendlyName}');
    } else {
      print('Disconnected from Cast device');
    }
  });
}

7. 处理媒体播放状态

你还可以监听媒体播放状态的变化,以便在媒体开始播放、暂停或结束时做出相应的反应。

import 'package:flutter_cast_framework_v2/flutter_cast_framework.dart';

void listenToMediaStatus() {
  CastSessionManager.instance.addMediaStatusListener((mediaStatus) {
    if (mediaStatus.playerState == PlayerState.playing) {
      print('Media is playing');
    } else if (mediaStatus.playerState == PlayerState.paused) {
      print('Media is paused');
    } else if (mediaStatus.playerState == PlayerState.idle) {
      print('Media playback ended');
    }
  });
}

8. 结束 Cast 会话

当用户想要结束投屏时,你可以调用 endSession 方法来结束当前的 Cast 会话。

import 'package:flutter_cast_framework_v2/flutter_cast_framework.dart';

void endCastSession() async {
  await CastSessionManager.instance.endSession();
}

9. 处理错误

在使用 flutter_cast_framework_v2 时,可能会遇到一些错误。你可以通过捕获异常来处理这些错误。

try {
  await CastContext.initialize();
} catch (e) {
  print('Failed to initialize CastContext: $e');
}
回到顶部