Android MediaPlayer 锁屏后从新进入黑屏 问题解决方法_android app锁屏再打开黑屏-程序员宅基地

技术标签: android  锁屏  黑屏  MediaPlayer  

导致锁屏黑屏的原因:
播放视频过程中锁屏不可见时,则SurfaceHolder对象会销毁,当切换可见时,因为mediaPlayer.setDisplay()的SurfaceHolder对象不存在,所以只有声音没有视频。


解决方案: 可以在初始化时通过surfaceView获取SurfaceHolder对象,通过SurfaceHolder的addCallback方法监听SurfaceHolder.Callback接口,然后在surfaceCreated中去实现mediaplay初始化监听和播放,还需在surfaceDestroyed销毁时释放mediaplay资源,防止其它应用获取不了mediaplay资源。


SurfaceHolder.Callback三个回调方法分别如下:

surfaceCreated
首次创建后立即调用此方法。此实现应启动所需的任何渲染代码。

surfaceChanged
在对表面进行任何结构更改(格式或大小)后,立即调用此方法

surfaceDestroyed
在表面被破坏之前立即调用此方法。从此调用返回后,您不应再尝试访问此表面。如果具有直接访问曲面的渲染线程,则必须确保该线程不再与曲面接触,然后才能从该函数返回。



翻译有点不准,不过没关系下面会放下google文档连接地址:
Android Developer SurfaceHolder.Callback 文档




最后的在放下源码:

 private int mediplayerCurrentPosition = 0;//视频播放进度
    private String mediaplayResourcesUrl ="";//视频资源路径
    private boolean isDestroyed = false;
    @Override
    public void onPrepared(MediaPlayer mp) {
    
        if (!mediaPlayer.isPlaying()) {
    
            if(isDestroyed){
    
                isDestroyed = false;
                mediaPlayer.seekTo(mediplayerCurrentPosition,SEEK_CLOSEST);// SEEK_CLOSEST 移动到最近的一帧
            }
            mediaPlayer.setDisplay(surfaceView.getHolder());
            mediaPlayer.start();
        }
    }


    /**
     * 当不可见的时候 ,surfaceholder就会销毁,当再次可见的时候,创建新的surfaceholder;
     * 使用SurfaceHolder.Callback()维护一个SurfaceHolder
     */
    class SurfaceViewCallback implements SurfaceHolder.Callback {
    
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
    
            if(mediaPlayer==null){
    
                mediaPlayer = new MediaPlayer();
                try {
    
                    mediaPlayer.setDataSource(mediaplayResourcesUrl);
                } catch (IOException e) {
    
                    e.printStackTrace();
                }
                mediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
                mediaPlayer.setVolume(0.f, 0.f);
                mediaPlayer.setLooping(true);
                mediaPlayer.setOnPreparedListener(NetworkSpeedFragment.this);
                mediaPlayer.setDisplay(holder);
                mediaPlayer.prepareAsync();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
    
            if(mediaPlayer!=null){
    
                isDestroyed = true;
                mediplayerCurrentPosition = mediaPlayer.getCurrentPosition();
                mediaPlayer.release();
                mediaPlayer=null;
            }

        }

    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Rookie_or_beginner/article/details/115129648

智能推荐

ASP.NET Core 运行原理解剖[5]:Authentication-程序员宅基地

文章浏览阅读3.1k次。在现代应用程序中,认证已不再是简单的将用户凭证保存在浏览器中,而要适应多种场景,如App,WebAPI,第三方登录等等。在 ASP.NET 4.x 时代的Windows认证和Forms认证已无法满足现代化的需求,因此在ASP.NET Core 中对认证及授权进行了全新设计,使其更加灵活,可以应付各种场景。在上一章中,我们提到HttpContext中认证相关的功能放在了独立的模块中,以扩展的方式来展_.net core authenticationhandler httpcontext

java8特性:list转Map并排序_list转成map且顺序不变-程序员宅基地

文章浏览阅读1.5w次。初始代码public Map<String,List<RgwstBean>> getMap(List<RgwstBean> lists){ Map<String,List<RgwstBean>> map = new TreeMap<String,List&am_list转成map且顺序不变

leaflet通过WFS服务加载geoserver 矢量数据_leaflet geoserver wfs 方式-程序员宅基地

文章浏览阅读5.9k次,点赞5次,收藏16次。leaflet通过WFS服务加载geoserver 矢量数据1.前言2.从geoserver获得geojson数据3.geoserver跨域配置4.根据请求结果生成layer5.完整代码1.前言leaflet默认支持的服务只有WMS,因此不能加载WFS数据,但是leaflet提供了另一个方法geoJson,它的作用是从一个geojson文件中加载地图,所以利用leaflet加载WFS数据的一个..._leaflet geoserver wfs 方式

自定义动画animate_使用animate方法制作任意动画是什么意思-程序员宅基地

文章浏览阅读937次。开发工具与关键技术:VS,MVC作者:陈梅撰写时间:2019年6月2 日所有代码来源与老师教学这次分享一个好玩的自定义动画效果,这次还是用jQuery做出来的小功能。这次我们先直接看最后已经布局好的效果。把所想写的内容填写到p标签中,给到p标签的动画功能是,页面已执行时,p标签的内容就会渐渐消失。在给一个紫色的div盒子,这个盒子要实现四种动画效果,所以给这四个动画效果一个下拉框,选择..._使用animate方法制作任意动画是什么意思

如何在MonogoDB中查看配置的参数值-程序员宅基地

文章浏览阅读1k次。怎样在MongoDB实现mysql show variables like 'xx';例如:1.查看所有参数值:C:\Users\duansf>mongoMongoDB shell version: 2.6..._查看mongodb 默认参数值

【ACO TSP】基于matlab蚁群算法求解旅行商问题【含Matlab源码 1583期】-程序员宅基地

文章浏览阅读863次。蚁群算法求解旅行商问题完整的代码,方可运行;可提供运行操作视频!适合小白!

随便推点

计算机网络实验报告建立校园网,计算机网络实验报告-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏29次。设计性实验报告一、实验目的通过对网络设备的连通和对拓扑的分析,加深对常见典型局域网拓扑的理解;通过路由建立起网络之间的连接,熟悉交换机、路由器的基本操作命令,了解网络路由的设计与配置。二、背景描述假设某校园网通过1台三层交换机连到校园网出口路由器,路由器再和校园外的另一台路由器相接,现做适当配置,实现校园网内部主机与校园网外部主机的相互通信。三、实验设备二层交换机五台、三层交换机一台,路由器两台,..._计算机网络校园网组建 实训报告

蓝桥杯之等差素数列_长度为十的等差素数列,公差最小是多少蓝桥杯-程序员宅基地

文章浏览阅读554次,点赞2次,收藏3次。题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。2,3,5,7,11,13,....2,3,5,7,11,13,.... 是素数序列。 类似:7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。上边的数列公差为 30,长度为 66。20042004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!有这一理论为基础,请你借助手中的计算机,满怀信心地搜_长度为十的等差素数列,公差最小是多少蓝桥杯

iOS应用内付费(IAP)开发步骤列表_ios 添加订阅会员项目开发-程序员宅基地

文章浏览阅读1.6k次。配置Developer.apple.com登录到Developer.apple.com,然后进行以下步骤:为应用建立建立一个不带通配符的App ID用该App ID生成和安装相应的Provisioning Profile文件。配置iTunes Connect登录到iTunes Connet,然后进行以下步骤:用该App ID创建一个新的应用。在该应用中,创建应用内付费项_ios 添加订阅会员项目开发

比较器-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏46次。比较器比较器:顾名思义,做比较的。比较两个电压,然后输出高低电平。01不带反相的比较器当Vin>Vref,输出高电平,当Vin<Vref,输出低电平.02带反相的比较器当Vin>Vref,输出低电平,当Vin<Vref,输出高电平.03LM139比较器简化后的内部架构蓝色框:PNP差分放大器。每一边差分级使用达林顿 PNP 晶体管。使用达林顿连接晶..._比较器

如何深入学习c语言,如何深入学习C语言?-程序员宅基地

文章浏览阅读2.1k次。匿名用户1级2016-09-11 回答其实吧,学习C语言是以后从事软件设计的一个基础。任何领域都需要长时间的投入才有结果,你现在学习了C语言,再学习其他语言的时候就比较上手了。在软件设计中:学习一门语言仅仅是第一阶段:如果你基本掌握了一门语言,那么再想深入学习的话就需要把所有C语言的相关的库函数弄懂,并熟练掌握一个开发平台(如最基础的TC)。这是第二阶段下一阶段你就需要继续学习不同的操作系统所提供..._c语言入门后怎么深入

React Native 嵌入到iOS原生项目_ios原生项目嵌入reactnative 模块-程序员宅基地

文章浏览阅读672次。如果你正准备从头开始制作一个新的应用,那么React Native会是个非常好的选择。但如果你只想给现有的原生应用中添加一两个视图或是业务流程,React Native也同样不在话下。只需简单几步,你就可以给原有应用加上新的基于React Native的特性、画面和视图等。https://zjqian.github.io/2017/05/03/rn-integration-iosNative/_ios原生项目嵌入reactnative 模块

推荐文章

热门文章

相关标签