android mediaplayer SurfaceView

简介:           package com.curiousby.baoyou.cn.DemoMediaPlayer.activity; import android.app.

 

 



 

 

 

package com.curiousby.baoyou.cn.DemoMediaPlayer.activity;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle; 
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.SeekBar;

import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

import com.curiousby.baoyou.cn.R;
    /*
    *
    *1.VideoView本身就是对SurfaceView和MediaPlayer做了一个封装
    *2.实现视频列表播放
    *
    * 如果读取本地文件,和网络的话 需要添加权限
    *
    * */
public class MainActivity extends  Activity {


    private MediaPlayer mediaPlayer;
    private SurfaceView surfaceView; 
    private SeekBar seekbar;
    
        //读取本地文件
    private File file=new File("/storage/emulated/legacy/Pictures/Screenshots", "1.mp4");
        //访问网络视频
    private String uri="http://7xqwgk.com1.z0.glb.clouddn.com/mysqlconsole.mp4";
	protected TimerTask timeTask; 
	private Timer timer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.e("baoyou", "file.exists()"+file.exists());
        seekbar = (SeekBar) findViewById(R.id.sb_video_seekbar);
        surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        mediaPlayer = new MediaPlayer();
        //获取SurfaceHolder 可以通过该接口来操作SurfaceView中的Surface
        SurfaceHolder surfaceHolder = surfaceView.getHolder();
        //设置Meiaplayer的准备监听
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                //准备完成后播放
                mediaPlayer.start();
            }
        });
        
        surfaceHolder.addCallback(new SurfaceHolder.Callback() {
           
			//当SurfaceView中Surface创建时回掉
            //该方法表示Surface已经创建完成,可以在该方法中进行绘图操作
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                mediaPlayer.reset();
                try {
                //设置视屏文件图像的显示参数	
                mediaPlayer.setDisplay(holder);
                // file.getAbsolutePath(); //本地视频
                seekbar.setEnabled(true); 
                //Log.e("baoyou", file.length()+""+"=========mediaPlayer.getDuration()=========");
               // seekbar.setMax(Integer.parseInt(file.length()+"")); 
                mediaPlayer.setDataSource(file.getAbsolutePath());
                //uri 网络视频
                //mediaPlayer.setDataSource(MainActivity.this, Uri.parse(uri));
                //prepare();表示准备工作同步进行,(准备工作在UI线程中进行)
                //当播放网络视频时,如果网络不要 会报ARN 所以不采用该方法
                mediaPlayer.prepare();
                //异步准备 准备工作在子线程中进行 当播放网络视频时候一般采用此方法
                //mediaPlayer.prepareAsync();
                
                timer=new  Timer();
                timeTask=new TimerTask() {
                     
                    @Override
                    public void run() { 
                    	Log.e("baoyou", mediaPlayer.getCurrentPosition()+"=========mediaPlayer.getCurrentPosition()=========");
                    	 
                    	 int position = mediaPlayer.getCurrentPosition();  
                         int duration = mediaPlayer.getDuration();  
                           
                         if (duration > 0) {  
                             long pos = seekbar.getMax() * position / duration;  
                             seekbar.setProgress((int) pos);  
                         }  
                         
                    }
                };     
                timer.schedule(timeTask, 0, 1000);
                
                
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            //当SurfaceView的大小发生改变时候触发该方法
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }
            //Surface销毁时回掉
            //当Surface销毁时候,同时把MediaPlayer也销毁
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mediaPlayer!=null) {
                    mediaPlayer.stop();
                    //释放资源
                    mediaPlayer.release();
                }
            }
        });
        //设置 surfaceView点击监听
        surfaceView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        if (mediaPlayer.isPlaying()) {
                            mediaPlayer.pause();
                        } else {
                            mediaPlayer.start();
                        }
                        break;
                }
                //返回True代表事件已经处理了
                return true;
            }
        });
        
        
    }

    
    
    
}

 

 

 

 

<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"   
    android:gravity="center_vertical">

    <RelativeLayout 
        android:id="@+id/rl_video_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"  >
    
        <SurfaceView
            android:id="@+id/surfaceView"
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
        
        <SeekBar 
            android:id="@+id/sb_video_seekbar"
            android:layout_above="@+id/ll_video_operation" 
             android:layout_width="match_parent"
       		 android:layout_height="wrap_content"
       		 android:background="@color/white"
            > 
        </SeekBar>
        <LinearLayout 
             android:id="@+id/ll_video_operation" 
             android:layout_width="match_parent"
        	 android:layout_height="30dip" 
        	 android:gravity="center_horizontal"
        	 android:background="@color/white"
        	  android:layout_alignParentBottom="true"
            >
            <Button 
                 android:id="@+id/ll_video_operation_left"
            	 android:layout_width="wrap_content"
        	 	 android:layout_height="wrap_content" 
        	 	 android:text="开始"
        	 	 android:textColor="@color/black"
        	 	 android:background="@android:color/transparent"
                />
        </LinearLayout>
    </RelativeLayout>
    
    
</RelativeLayout>

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
前端开发 开发工具 Android开发
Android播放器之SurfaceView与GLSurfaceView
Surface的官方介绍:Handle onto a raw buffer that is being managed by the screen compositor,Surface是一个raw buffer的句柄,通过它在raw buffer上进行绘制,可以通过Surface获得一个Canvas。
277 0
|
6月前
|
XML Java Android开发
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
229 0
|
2月前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
164 8
|
2月前
|
Android开发
Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
本文介绍了 Android 平台上的 SurfaceView,这是一种高效的图形渲染控件,尤其适用于视频播放、游戏和图形动画等场景。文章详细解释了其双缓冲机制,该机制通过前后缓冲区交换来减少图像闪烁,提升视觉体验。然而,SurfaceView 与普通 View 叠加时可能存在 Z-Order 不一致、同步问题及混合渲染难题。文中提供了使用 TextureView、调整 Z-Order 和创建自定义组合控件等多种解决方案。
140 9
|
3月前
|
Android开发
Android 利用MediaPlayer实现音乐播放
本文提供了一个简单的Android MediaPlayer音乐播放示例,包括创建PlayerActivity、配置AndroidManifest.xml和activity_player.xml布局,以及实现播放和暂停功能的代码。
27 0
Android 利用MediaPlayer实现音乐播放
|
4月前
|
Android开发 开发者
Android经典面试题之SurfaceView和TextureView有什么区别?
分享了`SurfaceView`和`TextureView`在Android中的角色。`SurfaceView`适于视频/游戏,独立窗口低延迟,但变换受限;`TextureView`支持复杂变换,视图层级中渲染,适合动画/视频特效,但性能略低。两者在性能、变换、使用和层级上有差异,开发者需按需选择。
83 1
|
5月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
5月前
|
存储 Android开发
安卓app,MediaPlayer播放本地音频 | 按钮控制播放和停止
在Jetpack Compose中,不直接操作原生Android组件如`Button`和`MediaPlayer`,而是使用Compose UI构建器定义界面并结合ViewModel管理音频播放逻辑。以下示例展示如何播放本地音频并用按钮控制播放/停止:创建一个`AudioPlayerViewModel`管理`MediaPlayer`实例和播放状态,然后在Compose UI中使用`Button`根据`isPlaying`状态控制播放。记得在`MainActivity`设置Compose UI,并处理相关依赖和权限。
|
5月前
|
存储 Android开发 Kotlin
Kotlin开发安卓app,在使用 MediaPlayer 播放 res/raw 中的音乐时遇到突然中断的问题,而 onErrorListener 没有接收到任何报错
在使用 Android MediaPlayer 播放 res/raw 中的音乐时遇到中断问题,可能的原因包括资源问题、媒体文件编码格式、生命周期管理和设备资源配置。要排查问题,检查音频文件是否正确包含,格式编码是否支持,MediaPlayer 是否正确管理及释放,以及设备是否有足够存储和配置。通过设置 onErrorListener 日志和确保在 onDestroy 中释放资源来调试。如果文件过大,考虑使用 AssetManager。遵循这些步骤可帮助诊断并解决播放中断的问题。
|
5月前
|
API Android开发 UED
56. 【Android教程】媒体播放器:MediaPlayer
56. 【Android教程】媒体播放器:MediaPlayer
107 0