Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多个活动的MediaPlayer和SurfaceView

多个活动的MediaPlayer和SurfaceView
EN

Stack Overflow用户
提问于 2016-10-02 18:04:50
回答 1查看 248关注 0票数 0

我有一个媒体播放器在一个活动(称为播放器),我希望能够支持连续视频播放时,播放器是关闭成一个小型视图的父活动。

在只有音频的情况下,我能够很好地做到这一点,问题在于我通过mediaPlayer.setDisplay()附加了一个mediaPlayer.setDisplay;

我可以附加SurfaceView刚开始只是很好,但问题开始时,我关闭播放器活动。如果我不做任何更改,mediaPlayer就会以通常的无用错误(1,-19)被抛入错误状态。

当播放器setDisplay被销毁时,我尝试使用SurfaceView (Null),这似乎是有效的。但出于某种原因,它重置了视频流。为了弄清发生了什么,我尝试过重写seekTo(),但是没有调用seekTo()。我还把日志语句放在我能想到的任何地方,但没有触发任何东西。

为什么setDisplay(null)会导致我的视频流重新启动?

下面是我当前的MediaPlayer代码(一些奇怪的东西来自于我试图解决这个问题(比如isReallyPlaying()):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private ScheduledFuture beeperhandle;

    private boolean isPaused = false;
    private BaseMedia currentMedia;

    private PlaybackService.RepeatStatus repeatStatus = PlaybackService.RepeatStatus.REPEAT_NONE;

    public void startMedia(BaseMedia model, Integer position) {
        Timber.d("Starting media");
        startBeeper();
        isPaused = false;
        lastBeep = -1;
        currentMedia = model;

        if (position != null) {
            seekTo(position);
        }
        super.start();
    }

    public BaseMedia getCurrentMedia() {
        return currentMedia;
    }



    @Override
    public void start() throws IllegalStateException {
        Timber.e("Invalid start called, should request startSong or startVideo");
    }

    private int lastBeep = -1;

    // Because isPlaying is returning false and canceling the beeper.  Probably has something to do with the surfaceview being destroyed
    private boolean isStillPlaying() {
        if (lastBeep != getCurrentPosition()) {
            lastBeep = getCurrentPosition();
            return true;
        }
        return false;
    }

    private final Runnable seekBarCheck = new Runnable() {
        public void run() {

            if (isStillPlaying() && !beeperhandle.isCancelled()) {
                EventBus.getDefault().post(new MusicStatusTimeEvent(
                        currentMedia, true, GevaldMediaPlayer.this));
            } else {
                Timber.d("Canceling Beeper, !isPlaying");
                beeperhandle.cancel(true);
            }
        }
    };

    private void startBeeper() {
        Timber.d("Starting Beeper");
        beeperhandle = scheduler.scheduleAtFixedRate(seekBarCheck, 100, 100, TimeUnit.MILLISECONDS);
    }

    @Override
    public void seekTo(final int msec) throws IllegalStateException {
        Timber.d("Seeking to " + msec);
        if (beeperhandle != null) {
            Timber.d("Canceling beeper in prep for seek");
            beeperhandle.cancel(true);
        }
        setOnSeekCompleteListener(new OnSeekCompleteListener() {
            @Override
            public void onSeekComplete(MediaPlayer mp) {
                Timber.d("Seek complete to: " + msec);
                startBeeper();
            }
        });
        super.seekTo(msec);
    }


    @Override
    public void stop() throws IllegalStateException {
        super.stop();
        Timber.d("Stopping media");
        doStop();
    }

    private void doStop() {
        if (beeperhandle != null) {
            Timber.d("Canceling beeper, doStop");
            beeperhandle.cancel(true);
        }
        isPaused = false;
    }

    @Override
    public void pause() throws IllegalStateException {
        Timber.d("Pause requested");
        if (beeperhandle != null) {
            Timber.d("Canceling beeper, pause");
            beeperhandle.cancel(true);
        }
        doStop();
        EventBus.getDefault().post(new MusicStatusStoppedEvent(this));
        super.pause();

    }

    public boolean isPaused() {
        return isPaused;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-05 19:17:05

弄明白了。显然,关闭某个活动会导致音频丢失,其值为AudioManager.AUDIOFOCUS_LOSS。

因为我是一个好的安卓公民,这是准备释放媒体播放器。但音频将被恢复,这将导致我的媒体播放器得到重置,因此从一开始。

这恰好发生在setDisplay()方法周围。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39823674

复制
相关文章
java键值对_Java 读写键值对
public static void main(String[] args) throws IOException {
全栈程序员站长
2022/07/23
2.1K0
Qt中QMap键值对基本用法(键值对)
T1为键值对中的键key,T2为键值对中的值。通过键值对中的键可以搜索到值。一般来说,键值对中的键是唯一的,不可重复,而值没有要求,可以重复。并且QMap具有自动排序功能,对输入的键进行排序。
全栈程序员站长
2022/09/02
3.6K0
键值对操作
键值对 RDD 通常用来进行聚合计算。我们一般要先通过一些初始 ETL(抽取、转化、装载)操作来将数据转化为键值对形式。键值对 RDD 提供了一些新的操作接口(比如统计每个产品的评论,将数据中键相同的分为一组,将两个不同的 RDD 进行分组合并等)。
全栈程序员站长
2022/07/23
3.5K0
键值对操作
键值对RDD数据分区
所以主要了解HashPartitioner分区器,RangePartitioner分区器及自定义分区器。
用户1483438
2022/05/06
2.3K0
【Python】字典 dict ② ( 字典常用操作 | 字典 新增 / 更新 键值对元素 | 字典 删除 键值对元素 | 字典 清空 键值对元素 )
上面的语法 , 就是向 字典变量 中添加新的 键值对元素 键Key: 值Value ;
韩曙亮
2023/10/11
3430
5 spark入门键值对foldByKey
可以看到,第一个参数是zeroValue,这个就是用来对原始的V做合并操作的,后面的参数是一个JFunction操作。
天涯泪小武
2019/01/17
1.2K0
Python-字典:键值对的魔法世界
在Python中,字典(Dictionary)是一种强大且常用的数据结构,它允许我们存储和组织键值对(Key-Value)数据。与列表和元组不同,字典中的数据是无序的,但每个数据都与一个唯一的键相关联,这使得字典在表示和访问数据时非常高效
用户9006224
2023/10/11
2620
Spark笔记8-键值对RDD
键值对RDD 创建 从数据中进行加载生成键值对RDD lines = sc.textFile("word.txt") pairRDD = lines.flatMap(lambda line: line.split(" ")) \ # 将数据先进行分割split,再拍平flat,形成单个的元素 .map(lambda word:(word, 1)) # 单个元素和1组成元组的形式,键值对RDD pairRDD.foreach(print) ("hadoop", 1) ("sp
皮大大
2021/03/02
8540
RDD操作—— 键值对RDD(Pair RDD)
“键值对”是一种比较常见的RDD元素类型,分组和聚合操作中经常会用到。 Spark操作中经常会用到“键值对RDD”(Pair RDD),用于完成聚合计算。普通RDD里面存储的数据类型是Int、String等,而“键值对RDD”里面存储的数据类型是“键值对”。
羊羽shine
2019/08/21
3K0
[翻译]Android教程-保存数据-保存键值对
http://developer.android.com/training/basics/data-storage/index.html
LeoXu
2018/08/15
2.6K0
etcd 存储:如何实现键值对的读写操作?
你好,我是 aoho,今天我和你分享的主题是 etcd 存储:如何实现键值对的读写操作?
aoho求索
2022/06/23
1.6K0
etcd 存储:如何实现键值对的读写操作?
【说站】python字典中键值对的操作
对于字典中不再需要的信息,可以使用del句子完全删除相应的键值。使用del句子时,必须指定字典名称和要删除的键。
很酷的站长
2022/11/23
9820
【说站】python字典中键值对的操作
Redis中存储亿级键值对
迁移系统时,有时你必须建立一个小脚手架。我们最近不得不这样做:在Instagram上,于遗留原因,我们需要将大约3亿张照片映射到创建它们的用户的ID,以便了解要查询的分片(请参阅有关我们的更多信息)分片设置)。虽然所有客户端和API应用程序都已更新并向我们返回 完整信息,但仍有许多人缓存的旧数据。我们需要一个解决方案:
银河1号
2019/05/15
1.6K0
Python字典查询键值对的方法【大全】
查找是我们所有数据类型学习中的重点,字典也不例外,用不同的方法从不同的维度查找,应有尽有。下面就从简到难一步一步来学习字典的查询方法。
python自学网
2021/12/02
4.3K0
Python字典查询键值对的方法【大全】
【说站】python字典如何删除键值对
以上就是python字典删除键值对的方法,希望对大家有所帮助。更多Python学习指路:python基础教程
很酷的站长
2022/11/23
3.4K0
【说站】python字典如何删除键值对
4 spark入门键值对聚合操作combineByKey
combineByKey是spark中一个核心的高级函数,其他多个键值对函数都是用它来实现的,如groupByKey,reduceByKey等等。
天涯泪小武
2019/01/17
1.8K0
网络请求 header 的内容以及各个键值对的含义
User-Agent:User-Agent 的内容包含发出请求的⽤户信息。 Accept:指定客户端能够接收的内容类型。 Accept-Encoding:指定浏览器可以⽀持的 web 服务器返回内容压缩编码类型。 Accept-Language:浏览器可接受的语⾔。 Connection:表示是否需要持久连接。(HTTP 1.1 默认进⾏持久连接)。 Content-Length:请求的内容⻓度。 If-Modified-Since:如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回 304 代 码。 Referer:先前⽹⻚的地址,当前请求⽹⻚紧随其后,即来路。
全栈程序员站长
2022/07/08
4220
遍历map的键值对的方法(深入浅出)
map特点就是采用了 Key-value键值对映射的方式进行存储 。下面我们谈谈遍历map的方式。下面的内容默认读者对map集合的基本用法有所了解。
jiankang666
2022/05/12
7850
遍历map的键值对的方法(深入浅出)
python学习系列(五)键值对的数据集合Dict
dict是dictionary的缩写,顾名思义就是字典类型,我们查字典是先查偏旁部首,然后找到对应的页数,然后查找我们要查的字。这个偏旁部首对应的页数就是dict里的key,我们要查的字就是value。dict的精髓就是通过key去关联value,key的值可以是任何不变的类型,通常是数字和字符串(dictionaries are indexed by keys, which can be any immutable type; strings and numbers can always be keys.),value可以是任何类型。
zhanyd
2022/05/16
7400
python学习系列(五)键值对的数据集合Dict
当JSON.parse”遇上”非键值对
在json大行其道并作为前后端主要通讯的数据格式之一时,对json本身的使用和了解多少人都会有些概念,当然随之而来的也是对json的对象以及其字符串形式的互相转换。在历史久远的过去,前端是通过低能的eval来实现格式转换的。
RobinsonZhang
2018/08/28
2.3K0

相似问题

相对元素超过视口

15

100%宽元素的伸长不超过视口宽度。

21

元素宽度时居中对齐<视口,元素宽度时右对齐+滚动>视口

20

视口宽度元素正在中断

10

元素的宽度大于视口…的宽度时

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文