如何使用 Google Cast SDK 3 添加自定义 SessionProvider

2023-12-24

我们最近将 Google Cast SDK 更新至版本 3。使用此 SDK,应该可以通过在期权提供者 https://developers.google.com/android/reference/com/google/android/gms/cast/framework/OptionsProvider。我们创建了一个自定义的会话提供者 https://developers.google.com/android/reference/com/google/android/gms/cast/framework/SessionProvider使用 getAdditionalSessionProviders() 方法返回。

然而,这个 SessionProvider 永远不会被使用,它可能只会在设备被发现并在选择列表中被选择时使用。媒体路由按钮 https://developer.android.com/reference/android/app/MediaRouteButton.html如中所述按下Session https://developers.google.com/android/reference/com/google/android/gms/cast/framework/Session文档。但我们找不到将我们发现的非广播设备添加到此列表中的方法。我们搜索了在线可用的 API、文档和示例,但找不到如何执行此操作。我们只找到了旧版本 sdk 的示例,但这些版本完全不同且无法使用。

我们希望使用此功能通过三星的 SmartView SDK 将三星电视添加到 Google Cast 列表,就像 YouTube 和 Netflix 应用程序一样。


创建自定义媒体路由提供程序:这是一个用于自定义媒体路由的假 MediaRouteProvider。该类除了发布一个假的自定义 MediaRoute 之外什么也不做,以便 MediaRouter 中的 Cast SDK 可以看到并选择它。

import android.content.Context;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.Bundle;
import android.support.v7.media.MediaRouteDescriptor;
import android.support.v7.media.MediaRouteDiscoveryRequest;
import android.support.v7.media.MediaRouteProvider;
import android.support.v7.media.MediaRouteProvider.RouteController;
import android.support.v7.media.MediaRouteProviderDescriptor;
import android.support.v7.media.MediaRouter;
import java.util.ArrayList;

public final class CustomMediaRouteProvider extends MediaRouteProvider {
  private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
  private static MediaRouteDescriptor DEFAULT_MEDIA_ROUTE_DESCRIPTOR;

  static {
    // This filter will be used by Cast SDK to match the session category.
    IntentFilter customControls = new IntentFilter();
    customControls.addCategory(CustomSessionProvider.CUSTOM_CATEGORY);

    CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>();
    CONTROL_FILTERS_BASIC.add(customControls);

    Bundle extras = new Bundle();
    extras.putCharSequence("ROUTE_URL", "http://abcdef.cyz");
    DEFAULT_MEDIA_ROUTE_DESCRIPTOR =
        new MediaRouteDescriptor.Builder("fake-custom-route-id", "fake custom route")
            .setDescription("Foo description")
            .addControlFilters(CONTROL_FILTERS_BASIC)
            .setPlaybackStream(AudioManager.STREAM_MUSIC)
            .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
            .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
            .setVolumeMax(100)
            .setVolume(10)
            .setExtras(extras)
            .build();
  }

  public CustomMediaRouteProvider(Context context) {
    super(context);
  }

  @Override
  public void onDiscoveryRequestChanged(MediaRouteDiscoveryRequest request) {
    if (request == null || request.getSelector() == null) {
      return;
    }

    publishRoutes();
  }

  @Override
  public RouteController onCreateRouteController(String routeId) {
    return null;
  }

  private void publishRoutes() {
    MediaRouteProviderDescriptor providerDescriptor =
        new MediaRouteProviderDescriptor.Builder().addRoute(DEFAULT_MEDIA_ROUTE_DESCRIPTOR).build();

    setDescriptor(providerDescriptor);
  }
}

您需要为自定义会话提供 SessionProvider 实现:

import android.content.Context;
import com.google.android.gms.cast.framework.Session;
import com.google.android.gms.cast.framework.SessionProvider;

public class CustomSessionProvider extends SessionProvider {
  public static final String CUSTOM_CATEGORY = "CUSTOM";

  public CustomSessionProvider(Context applicationContext) {
    super(applicationContext, CUSTOM_CATEGORY);
  }

  @Override
  public Session createSession(String sessionId) {
    return new CustomSession(getContext(), getCategory(), sessionId);
  }

  @Override
  public boolean isSessionRecoverable() {
    return true;
  }
}

和会话实现:这是自定义媒体路由类型的假会话实现。它总是在开始/恢复/结束时成功。

import android.content.Context;
import android.os.Bundle;
import com.google.android.gms.cast.framework.Session;

public class CustomSession extends Session {
  private static final String FAKE_SESSION_ID = "custom.session.id.12345";

  CustomSession(Context applicationContext, String category, String sessionId) {
    super(applicationContext, category, sessionId);
  }

  @Override
  protected void start(Bundle routeInfoExtra) {
    notifySessionStarted(FAKE_SESSION_ID);
  }

  @Override
  protected void resume(Bundle routeInfoExtra) {
    notifySessionResumed(false);
  }

  @Override
  protected void end(boolean stopCasting) {
    notifySessionEnded(0);
  }
}

在 Cast V3 发送器应用中,指定其他会话提供程序:

public class CastOptionsProvider implements OptionsProvider {
@Override
  public List<SessionProvider> getAdditionalSessionProviders(Context appContext) {
    List<SessionProvider> additionalProviders = new ArrayList<>();
    additionalProviders.add(new CustomSessionProvider(appContext));
    return additionalProviders;
  }
}

在您的应用程序中添加 MediaRouter 提供程序:

public class CastVideosApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    MediaRouter mediaRouter = MediaRouter.getInstance(this);
    mediaRouter.addProvider(new CustomMediaRouteProvider(this));
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Google Cast SDK 3 添加自定义 SessionProvider 的相关文章

随机推荐

  • 防止 akka actor 重新启动子 actor

    我正在努力找一个演员Worker不要重新启动它的子演员SubWorker当它被自己的主管重新启动时Mngr 即使在覆盖之后我也没有成功preRestart and postRestart in Worker 日志仍然显示SubWorker直
  • Android NDK -arm-linux-androideabi-g++:未找到

    我正在尝试在我刚刚安装的新 Ubuntu 中为 Android 目标构建 C POCO 库 我已经安装了Android NDK home user dev Android android ndk r9 x86并使用以下命令在环境变量中添加
  • 如何在控制台多行上更新数据

    我想在控制台的两行上显示数据 我只想每次更新这两行 到目前为止我所做的是 var logInline function alpha bravo process stdout cursorTo 0 0 process stdout clear
  • Html选择问题

    我在 html 选择元素中有一些长文本 当用户选择一个选项时 只要选择了 就会显示文本 使其可用且清晰的最佳解决方案是什么 Example
  • 您认为软件公司应该向开发人员强加一种编码风格吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 未指定所需属性“action”

    首先 我对我的英语不好感到抱歉 因为我不是以英语为母语的人 所以我的问题中可能存在一些与英语相关的错误 我希望任何读我问题的人都能理解我想说的 我是学习者 我正在将 PSD 转换为 XHTML 和 CSS 我已经完成了我的工作 但是当我在
  • 有没有深入的 ttk 造型指南? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 所以我最近开始涉足 Tkinter 并且我的想法是创建一个本质上讲故事的应用程序 最终 我希望对大多数
  • 使用 tshark 过滤 VoIP 呼叫

    我正在分析网络上的 VoIP 呼叫 目前我正在使用生成的 pcap 文件 但稍后我将实时监听该文件 我正在使用 tshark 我可以很容易地从 pcap 中过滤一些重要数据 例如 源 ip 地址和端口 目标 ip 地址和端口 有效负载 pc
  • 为 CLR 实现函数式语言(或者,关于 F# 实现的论文)

    有谁知道有关 F 编译器实现的任何好论文吗 我正在尝试为针对 CLR 的简单函数式语言生成 CIL 代码 但我在几个方面遇到了困难 函数式语言和 CIL 之间的差异使得生成类型正确的 CIL 代码变得困难 我有通过类型擦除来工作的解决方案
  • Crashlytics 上传 Android 原生库的符号成功,但 Firebase 控制台中没有显示任何符号?

    我正在尝试在 Android 应用程序中上传外部本机库的本机符号 所有设置和 crashlyticsUploadSymbolsRelease 似乎都成功了 我检查了 crashlytics log 它说 cSYM 文件正在生成并上传到htt
  • Azure 应用服务:使用性能计数器

    我正在尝试设置我的 Azure Web 应用程序以包含第三方软件的使用 这似乎需要访问 PerformanceCounters 在本地 这工作正常 但是当我在 Azure 中运行它时 出现以下错误 UnauthorizedAccessExc
  • 如何在python中读取pdf文件而不在unix中转换它? [复制]

    这个问题在这里已经有答案了 pdfile open tutorial pdf r xyz pdfile readlines pqr pdfile readline for a in xyz print a 该代码不显示实际内容 相反 它显示
  • 在准备好的语句上使用 fetch_assoc

    我目前正在编写登录脚本 我得到了以下代码 selectUser db gt prepare SELECT id password salt FROM users WHERE username selectUser gt bind param
  • git 网站更新策略 - 如何同步开发和实时存储库?

    以下是我构建 git 支持的网站更新和备份策略的方式 我可以通过 SSH 访问托管该网站的 Linux VPS 这是我所做的 1 在网站服务器上 在正确的网站文件夹 公共根之前的一级 创建了一个 git 存储库 cd path to web
  • Powershell复制文件或获取内容而不锁定它

    我们有一些预定的脚本 他们必须访问带有点源函数的文件 Functions ps1 此 Functions ps1 位于共享上 因为 ExecutionPolicy 我无法像这样加载文件 share folder Functions ps1
  • 使用 NSTimer 显示像汽油泵表一样动画的秒表计时器

    我是iOS开发新手 当我按下秒表开始按钮时 我想显示计时器 如计数器令牌效果 我附上了图像供您参考 我已经完成了显示秒和分钟 但我不知道 如何动画自动滚动效果 我怎样才能做到这一点 When the counter is moving it
  • Swift DidSelectRowAt 未触发

    我有一个项目 有几个不同的 VC 其中两个有 TableViews 第一个工作得很好 我在那里有一个自定义视图等 第二个也是自定义的 它填充了很好的信息 但与第一个不同 我无法点击它来继续下一个 VC 我已正确设置委托和数据源 我的项目中有
  • 在 ASP.NET 开发服务器下运行时,WebForms 中的 ASP.NET 路由不处理非 ASP 扩展

    我在 Visual Studio 2010 下创建了一个默认网站 在 Global asax 中添加了一个简单的路由 routes MapPageRoute AboutRoute about About aspx 当我启动时显示404ASP
  • glGenerateMipmap - 非 2 的幂

    环境 Ubuntu 17 04 Chrome 60 在本地运行此示例 不会出现警告 错误 https github com mdn webgl examples tree gh pages tutorial sample6 https gi
  • 如何使用 Google Cast SDK 3 添加自定义 SessionProvider

    我们最近将 Google Cast SDK 更新至版本 3 使用此 SDK 应该可以通过在期权提供者 https developers google com android reference com google android gms