SurfaceView+MediaPlayer视频播放并用SharedPreferences实现暂停功能

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的surface。我们可以控制这个surface的格式和尺寸。SurfaceView控制这个surface绘制的位置。surface类直接继承Object,对应了一块屏幕缓冲区,每个窗口window对应一个Surface,任何View都是画在Surface上的,传统的view共享一块屏幕缓冲区。


MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。


SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置


下面是布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.surfaceview_video.MainActivity">


    <SurfaceView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/surfaceView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>


MainActivity代码,其中多媒体数据源,为博主虚拟机sdcard中数据的路径,请自行设置数据源



package com.example.surfaceview_video;

import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private SurfaceView mSurfaceView;
    private MediaPlayer mediaPlayer;
    private SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        //建立sharedPreferences对象
         sp= getSharedPreferences("config", MODE_PRIVATE);
        //创建Mediaplayer的对象
        mediaPlayer = new MediaPlayer();
        try {
            //设置多媒体类的数据源(可以播放音乐或视频)
            mediaPlayer.setDataSource("/storage/emulated/0/Download/oppo.3gp");
            //让多媒体对象做好播放的准备
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取SurfaceView的控制器
        final SurfaceHolder holder = mSurfaceView.getHolder();
        //设置对SurfaceView对象的监听
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override//surfaceView创建时执行
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                //指定多媒体对象用哪个控件播放视频资源
                mediaPlayer.setDisplay(holder);
                //获取之前存放的位置,通过sp
                int config = sp.getInt("config",0);
                //让MediaPlayer根据这个进度进行播放
                mediaPlayer.seekTo(config);
                //使用MediaPlayer播放音乐
                mediaPlayer.start();
            }
            @Override//surfaceView被改变的时候
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }
            @Override//surfaceView被销毁时执行
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                //当多媒体对象存在时,关闭MediaPlayer对象,释放资源的逻辑操作
                if (mediaPlayer != null){
                    //把记录下来当前播放的位置
                    int currentPosition = mediaPlayer.getCurrentPosition();
                    //把记录下来的位置保存到sp下,先得到一个sp的编辑器,再根据数据存储的类型把数据存到文件里进行提交
                    sp.edit().putInt("config",currentPosition).commit();
                    //关闭MediaPlayer对象
                    mediaPlayer.stop();
                    //释放MediaPlayer资源
                    mediaPlayer.release();
                }
            }
        });
    }
}

使用SurFaceView实现视频播放 前言:虽然ViedoView控件可以播放视频,但播放的位置和大小并不受我们的控制,为了对视频有更好的控制权,可以使用MediaPlayer配合SurfaceView来播放视频。 实现效果: 1、SurfaceViewMediaPlayer配合使用: mediaPlayer.setDisplay(surfaceview.getHolder());//这一步是关键, 阅读详情

相关推荐

萤石轻应用集成指南:快速实现海康摄像机App视频预览

在移动应用开发中,音视频流媒体集成是常见的需求,尤其在安防监控、远程查看等场景。其核心原理在于通过网络协议获取音视频数据,并在客户端进行解码渲染。传统方案如设备直连SDK,虽然控制精细,但涉及复杂的网络穿透、协议适配与解码工作,开发门槛高。相比之下,基于云平台的轻应用方案,通过云端服务中转视频流,将复杂的底层技术封装,为开发者提供了更高的技术价值:显著降低集成复杂度、提升连接稳定性与开发效率。这种方案特别适用于需要快速实现稳定、低延迟视频预览功能的移动应用场景。本文以萤石云轻应用为例,详细解析如何通过其开放

weixin_30835649的博客 300

本示例使用 SurfaceView 播放视频

本示例使用 SurfaceView 播放视频,它可以使播放的位置和大小受我们的控制,使用MediaPlayer 配合 SurfaceView 来播放视频

SurfaceView+MediaPlayer封装之路

SurfaceView+MediaPlayer封装之路我的播放器叫做JsPlayer,喜欢的话,就给个star喽^_^https://github.com/shuaijia/JsPlayer这里我只介绍播放器封装思路,会贴出部分代码,如果大家想查看完整代码,可以去github查看,有不清楚或错误或改进的地方,可以issues 我!写在之前先上效果图:(1.5版本新增弹幕功能)为什么要用Surface

jiashuai94的博客 1万+

meidaplayer+surfaceview 实现的 一个常用播放器,包括大小屏切换,底部进度条,播放控制,屏幕旋转

meidaplayer+surfaceview 实现的 一个常用播放器,包括大小屏切换,底部进度条,播放控制,屏幕旋转处理

使用IjkMediaPlayer结合surfaceView播放视频,自己写的播放和暂停按钮(四)

使用IjkMediaPlayer结合surfaceView播放视频,自己写的播放和暂停按钮(四)标签: 视频暂停继续 播放网络视频 IjkMediaPlayer SurfaceView2017年12月20日 20:19:37503人阅读 评论(0) 收藏 举报 分类:用法概括(28)  实现效果(87) 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.ne...

frimary的博客 1147

Android 多媒体应用:视频播放之VideoView与SurfaceView

为什么要学习VideoView与SurfaceView VideoView 主函数程序 布局 SurfaceView SurfaceView的介绍 SurfaceView使用 主函数 布局为什么要学习VideoView与SurfaceView  在思考为什么学习VideoView与SurfaceView之前,先想一下为什么不适合实际开发,这是因为VideoView并不是支持播放所有格式的视频,它仅支

liujiaoruiIT的博客 4495

Android SurfaceView+MediaPlayer制作播放暂停停止

这个播放的坑实在是多 得自己控制好视频播放的声明周期 先上一张官网的生命周期图片 1、带单箭头的表示同步方法,双箭头的代表异步方法。 2、当一个MediaPlayer对象刚刚使用new创建,或者reset()被调用后,它处于Idle状态; 在release()被调用后,它处于End状态。 3、reset()方法调用后,新构造的MediaPlayer对象和MediaPlayer对象之间

谢耀眼 7679

SharedPreferences 在Service中调用示例

博客源址:Android学习笔记(13)————利用SharedPreferences来保存应用程序的数据  博客时间:2012-03-02 15:42 /********************************************************************************************  * author:co

Android移动开发者的专栏 5850

Android之SurfaceView实现视频播放

1.案例一 布局文件: [code="xml"] [/code] 主程序: [code="java"] public class SurfaceActivity extends Activity implements SurfaceHolder.Callback { ...

{丸の子} 288

Android中使用MediaPlayer类和SurfaceView播放视频

这是个简单的例子复制就能运行,都是将基本功能,要写的复杂点要对mediaplayer深入了解 效果 项目结构 视频的资源放在res---->raw------>xiaopingguo.mp4 布局     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent

翟浩浩Android专栏 2504

一步步自定义视频播放器——使用SurfaceView播放视频

Surface Surface与SurfaceView这篇文章对Surface和SurfaceView做了很详细的解释。 简单的说Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都要画在Surface的Canvas上。传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行。 Surface可以理解为: Surface类似一个句柄,可以得到Ca

梦的起点 5880

Android 使用MediaPlayer播放视频切换后台暂停再恢复互前台继续播放的bug修改

import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.view.KeyEvent; import android.view.Surf

刘胡来 2万+

Web自动化实战:从Gulp到Selenium与云端测试的完整指南

Web自动化是现代软件开发中提升效率与保障质量的关键技术,其核心原理是通过脚本或工具模拟用户操作,自动执行浏览器任务。这项技术的价值在于实现测试与构建流程的一致性和可重复性,显著提升持续集成与部署(CI/CD)的可靠性。在实际应用场景中,Web自动化主要分为构建流程自动化(如使用Gulp进行代码检查与转换)和浏览器操作自动化(如利用Selenium进行端到端测试)。通过结合本地任务运行器与云端测试服务,开发者可以构建覆盖多浏览器、多设备的健壮测试体系。本文聚焦于Selenium、Gulp等热词工具,深入探讨

Liusuzhi19610221的博客 1263

android播放视频功能,android surfaceView实现播放视频功能

本文实例为大家分享了android surfaceView实现播放视频的具体代码,供大家参考,具体内容如下RelativeLayoutxmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"a...

weixin_42364040的博客 750

gpu工作状态诊断脚本

gpu工作和链路状态

起航Service
博客等级 码龄10年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值