在 Android 5 上使用 MediaController

2023-12-15

我想用新的MediaController在 Android 5 中而不是旧版本中RemoteController用于获取当前播放的曲目并更改曲目。

我找不到任何例子,所以我自己尝试了一下。

获取当前的MediaController,我已经实现了一个扩展的类MediaController.Callback并实施MediaSessionManager.OnActiveSessionsChangedListener.

通过这种方法,我尝试获取当前mediaController:

@Override
public void onActiveSessionsChanged(List<MediaController> mediaControllers) {
    Log.i(Util.LOG_TAG, "sessions changed");
    if (mediaControllers != null && !mediaControllers.isEmpty()) {
        this.mediaController = mediaControllers.get(0);
        mediaController.registerCallback(this);
    }
}

但我想我必须注册我的课程。所以我已经做到了

MediaSessionManager mgr =  (MediaSessionManager)context.getSystemService(Context.MEDIA_SESSION_SERVICE);
mgr.addOnActiveSessionsChangedListener(this, null);

但是当我这样做时,我收到一个错误,指出我缺乏控制媒体的权限。 当我尝试添加此权限时,我注意到第三方应用程序无法使用此权限。

我究竟做错了什么?


UPDATE: 评论澄清说,问题实际上是关于查看/控制其他应用程序的 MediaSession,而不是您自己的。

尽管无法直接执行此操作,但由于隐私原因,您有两种选择,具有不同级别的可用控制/信息以及不同的用户交互要求:

  1. 如果您只想跳过音乐或播放/暂停,您可以发送媒体按钮事件(通过音频管理器)和/或请求/释放音频焦点.

  2. 如果您还需要了解当前正在播放的内容的元数据,则有一种更具侵入性的方法,需要显式的用户交互:

首先,创建并注册一个NotificationListenerService:

public class NotificationListener extends NotificationListenerService {
    public NotificationListener() {
    }
}

在AndroidManifest.xml中:

<service android:name=".NotificationListener"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
    android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

然后,您将能够通过在 getActiveSessions 调用中指定您的NotificationListenerService componentName 来获取MediaSessions:

MediaSessionManager mm = (MediaSessionManager) this.getSystemService(
    Context.MEDIA_SESSION_SERVICE);
List<MediaController> controllers = mm.getActiveSessions(
    new ComponentName(this, NotificationListener.class));
Log.i(TAG, "found " + controllers.size() + " controllers");

需要注意的是,用户需要明确授予您的应用程序通知访问权限,方法是转到“设置”->“声音和通知”->“通知访问”

原始回复:

描述 MediaSession 并可以传递以允许其他组件/应用程序控制现有 MediaSession 的对象是 MediaSession.Token。使用令牌,您可以直接创建 MediaController,而无需借助 MediaSessionManager。其代码类似于:

MediaController mediaController = new MediaController(getActivity(),
    sessionToken);

这不需要任何特殊许可。如果您还使用 MediaBrowser 或 MediaBrowserService,则应使用其 getSessionToken() 方法获取与 MediaBrowser 关联的令牌。

我们刚刚发布了一个例子它使用 MediaBrowserService 来处理音乐浏览、播放和媒体样式通知,并提供一个简单的 Activity 来控制播放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 5 上使用 MediaController 的相关文章

  • Google Drive REST API 是否仍需要 GET_ACCOUNTS 权限?

    Google 已弃用 Google Drive Android API 我们正在迁移到 Google Drive REST API v3 2年前 我们有使用Google Drive REST API v2 的经验 我们知道GET ACCOU
  • 简单 XML 框架:ElementMap 中的对象具有“类似内联”的行为

    我正在尝试在 Android 上序列化自定义对象的 Hashmap 以获得如下 xml
  • Android 位置 API:获取提供商状态

    在 Android 中获取位置提供商状态的最佳方式是什么 当注册 LocationListener 以进行位置更新时 onStatusChanged String provider int status Bundle extras 每当状态
  • 如何使用onDraw(Canvas)获取WebView的位图快照(Android)

    我曾经使用 capturePicture 方法来制作 WebView 的快照 此方法在 API 级别 19 中已弃用 该文档说 使用 onDraw Canvas 获取 WebView 的位图快照 但我真的不知道它是什么意思 你能教我如何解决
  • 如何检查 Android 设备是否在线

    我的服务器不断检查我的 Android 应用程序是否在线 请问我可以在我的android应用程序上执行哪些操作 创建一个名为 isNetworkAvailable 的帮助器方法 该方法将根据网络是否可用返回 true 或 false 它看起
  • Android:将图像裁剪为特定尺寸

    我的目的是让用户从图库中选择一张图像 然后进行裁剪活动 但是 我需要将定义裁剪蒙版的矩形锁定到某个尺寸 然后用户只需重新定位它即可显示图像的一部分 关于如何做到这一点有什么想法吗 Thanks T Intent intent new Int
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • NDK8d 未找到 std::string 操作(即 stol、stoi)

    我尝试使用 ndk r8d 和 c 11 支持来建立我的第一个 android 项目 一些 c 11 机制工作正常 即 lambda 表达式 但是当我尝试时 使用新的字符串操作之一 编译失败 错误 stol 不是 std 的成员 这是我的
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • RecyclerView 单击将数据传递到新活动

    我正在制作一个包含三个选项卡的应用程序 每个选项卡都有一个带有两个文本的 recyclerview 我希望用户能够单击任何 recyclerview 项目 并且该项目中的文本应传递到新活动 这是应用程序外观的图像 https i stack
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 作为 ViewPager 的一部分更新 ListFragment 中的数据

    我在 Android 中使用 v4 兼容性 ViewPager 我的 FragmentActivity 有一堆数据 这些数据将以不同的方式显示在我的 ViewPager 的不同页面上 到目前为止 我只有同一个 ListFragment 的
  • eglCodecCommon:setVertexArrayObject:设置vao调试消息

    我的 Android Emulator API 28 logcat 被这样的消息搞得晕头转向 D eglCodecCommon setVertexArrayObject set vao to 1 1 0 0 D eglCodecCommon
  • 如何在移动应用程序上连接到服务器?

    我是移动应用程序的新手 我基本上来自网络开发平台 我只是在玩 App Framework LungoJS Jquery Mobile kendo 等移动框架 以获得该垂直领域的一些知识 我正在开发的应用程序仍然处于 UI 级别 我所需要的只
  • Android 应用程序不需要任何特殊访问权限

    当我开始安装时myapp apk 我得到下面的屏幕 我的应用程序需要位置 外部存储权限 上述权限应该根据需要向用户请求 即在需要这些权限的代码之前 现在 当安装应用程序时 我会看到一个屏幕 上面显示应用程序不需要任何特殊访问权限 如下图所示
  • Android 中的 ODEX 文件是什么?

    经过一些android安装了应用程序 我发现它会变成odex文件 不是apk 在智 能手机中 这是怎么发生的 谁能教教我 我对此很感兴趣 博客文章 https stackoverflow com a 9593590 194894大部分是正确
  • 解析 XML 标签不匹配时出错

  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 如何在android中将文本放在单选按钮的左侧

    我想将单选按钮的文本放在左侧而不是右侧 我找到了这个解决方案
  • 带有不透明导航栏的深色文本透明状态栏

    等等 这不是重复的 类似的问题已被问到here https stackoverflow com questions 38025865 android fully transparent status bar with non transpa

随机推荐