`

Android之SurfaceView窗口/全屏播放

 
阅读更多

package com.FJICC.lzm;

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.media.AudioManager;
import android.app.AlertDialog;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;

public class multimedia_player2 extends Activity implements SurfaceHolder.Callback{


private MediaPlayer mMediaPlayer01;
private SurfaceView mSurfaceView01;
private SurfaceHolder mSurfaceHolder01;

private ImageButton mPlay;
private ImageButton mPause;
private ImageButton mReset;
private ImageButton mStop;

private boolean bIsPaused = false;
private boolean bIsReleased = true;
private boolean bIsReset = false;
private String strVideoPath = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.multimedia_player2);



if(!checkSDCard())
{
/* 检测是否有SD卡*/
mMakeTextToast
(
getResources().getText(R.string.str_err_nosd).toString(),
true
);
};


getWindow().setFormat(PixelFormat.UNKNOWN);

/*获取用来显示视频SurfaceView */
mSurfaceView01 = (SurfaceView) findViewById(R.id.surfaceView1);



/* 获取SurfaceHolder控制 SurfaceView*/
mSurfaceHolder01 = mSurfaceView01.getHolder();
mSurfaceHolder01.addCallback(this);

/*默认视频分辨率 176x144*/
mSurfaceHolder01.setFixedSize(176,144);
//设置.....
mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

/*获取ImageButton的ID */
mPlay = (ImageButton) findViewById(R.id.imageButton_start);
mPause = (ImageButton) findViewById(R.id.imageButton_pause);
mReset = (ImageButton) findViewById(R.id.imageButton_reset);
mStop = (ImageButton) findViewById(R.id.imageButton_stop);

mPlay.setEnabled(true);//初始状态 开启播放按钮,其他的设置为false
mPause.setEnabled(false);
mReset.setEnabled(false);

/*测试用播放视频*/
strVideoPath = "file:///sdcard/DCIM/test.mp4";

mPlay.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
/*启动Function */
if(checkSDCard())
{
if(bIsReleased == true){
showDialog(0);
playVideo(strVideoPath);
}
else if(bIsReset == true){
//mMediaPlayer01.start();
bIsReset = false;
}
mPlay.setEnabled(false);
mPause.setEnabled(true);
mReset.setEnabled(true);
}
}
});

/*暂停 */
mPause.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
if(checkSDCard())
{
if (mMediaPlayer01 != null)
{
if(bIsReleased == false)
{
if(bIsPaused==false)
{
mMediaPlayer01.pause();
bIsPaused = true;
mMakeTextToast("pause",true);
// mTextView01.setText(R.string.str_pause);
}
else if(bIsPaused==true)
{
mMediaPlayer01.start();
bIsPaused = false;
mMakeTextToast("start",true);
// mTextView01.setText(R.string.str_play);
}
}
}
}
}
});

/*复位重播*/
mReset.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
if(checkSDCard())
{
if(bIsReleased == false)
{
if (mMediaPlayer01 != null)
{

mMediaPlayer01.seekTo(0);//回到录像原点
// 如果是暂停状态回到原点,那么回到原点后还是暂停的,需要点击暂停键继续播放
//如果是播放的时候,点击复位播放,那么复位后自动是自动播放的。
}
}
}
}
});

/*关闭播放*/
mStop.setOnClickListener(new ImageButton.OnClickListener()
{
public void onClick(View view)
{
if(checkSDCard())
{
if (mMediaPlayer01 != null)
{
if(bIsReleased==false)
{
mMediaPlayer01.stop();
mMediaPlayer01.release();
bIsReleased = true;
// mMakeTextToast("["+mMediaPlayer01.toString()+"]",true);

mPlay.setEnabled(true);//回到初始状态 :开启播放按钮,其他的设置为false
mPause.setEnabled(false);
mReset.setEnabled(false);
}
}

}
}
});
}
/*播放视频函数*/
private void playVideo(String strPath)
{

//DisplayMetircs 类可以很方便的获取分辨率 获取窗口的分辨率
//这里获取窗口的大小
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

//设置Layout的参数
LayoutParams lp = mSurfaceView01.getLayoutParams();
lp.width = metrics.widthPixels/2;
lp.height =metrics.heightPixels/2;
mSurfaceView01.setLayoutParams(lp);

mMediaPlayer01 = new MediaPlayer();
mMediaPlayer01.setAudioStreamType(AudioManager.STREAM_MUSIC);


/* */
mMediaPlayer01.setDisplay(mSurfaceHolder01);

try
{
mMediaPlayer01.setDataSource(strPath);
}
catch (Exception e)
{
// TODO Auto-generated catch block
mMakeTextToast("setDataSource Exceeption:"+e.toString(),true);
//mTextView01.setText("setDataSource Exceeption:"+e.toString());
e.printStackTrace();
}

try
{
mMediaPlayer01.prepare();
}
catch (Exception e)
{
// TODO Auto-generated catch block
mMakeTextToast("setDataSource Exceeption:"+e.toString(),true);
//mTextView01.setText("prepare Exceeption:"+e.toString());
e.printStackTrace();
}

mMediaPlayer01.start();
bIsReleased = false;
//mTextView01.setText(R.string.str_play);
mMediaPlayer01.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer arg0)
{
// TODO Auto-generated method stub
mMakeTextToast("stop",true);
// mTextView01.setText(R.string.str_stop);

bIsPaused = true;//视频播放完毕了,就自动回到了0位置,并停止了。点击停止/继续 即可播放。
}
});
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub

//DisplayMetircs 类可以很方便的获取分辨率 获取窗口的分辨率
//这里获取 窗口 的分辨率大小
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

//设置Layout的参数
LayoutParams lp = mSurfaceView01.getLayoutParams();
lp.width = metrics.widthPixels/2;
lp.height =metrics.heightPixels/2;
mSurfaceView01.setLayoutParams(lp);
}

@Override
@Deprecated
protected Dialog onCreateDialog(int id) {
// TODO Auto-generated method stub

final View v = View.inflate(this, R.layout.multimedia_set, null);
final EditText videoPath = (EditText) v.findViewById(R.id.videoPath);
switch(id){
case 0:
{
Dialog dialog0 = new AlertDialog.Builder(this)
.setTitle("播放文件")
.setView(v).setMessage("请输入文件名:")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// 播放本地视频
//视频文件放置在SD卡下的DCIM目录下,这里设置为默认路径
//resetVideo();//重头播放,这个可以在播放完了后,执行,就可以实现循环播放了
strVideoPath= "file:///sdcard/DCIM/"+videoPath.getText().toString();//此时只需输入文件名称如:test.3gp;
setTitle("Playing" + strVideoPath);
}
}).create();
return dialog0;
}
default:
return null;

}

}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub

}

private boolean checkSDCard()
{
/* */
if(android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
{
return true;
}
else
{
return false;
}
}

public void mMakeTextToast(String str, boolean isLong)
{
if(isLong==true)
{
Toast.makeText(multimedia_player2.this, str, Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(multimedia_player2.this, str, Toast.LENGTH_SHORT).show();
}
}

//返回上一级Activity界面
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
Intent i =new Intent();
i.setClass(multimedia_player2.this,multimedia.class);
startActivity(i);
finish();
}


}

 

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/android2_bg9"
>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:orientation="vertical" >

<SurfaceView
android:id="@+id/surfaceView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="0dp" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" >

<ImageButton
android:id="@+id/imageButton_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/paly1" />

<ImageButton
android:id="@+id/imageButton_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/pause1" />

<ImageButton
android:id="@+id/imageButton_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/reset1" />

<ImageButton
android:id="@+id/imageButton_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/stop" />

</LinearLayout>
</LinearLayout>

</RelativeLayout>

分享到:
评论

相关推荐

    SurfaceView+MediaPlayer视频播放以及小窗口和全屏播放

    本文将深入探讨如何利用这两个组件实现视频播放,包括小窗口(悬浮窗口)播放和全屏播放。 `SurfaceView`是一个特殊的视图,它提供了一个直接与硬件图形渲染管道连接的表面,使得视频帧可以直接绘制到屏幕上,减少...

    surfaceview+mediaplayer实现视频播放和动态设置全屏窗口切换。

    总之,SurfaceView和MediaPlayer的结合使用是Android实现高效视频播放的常见方案,而动态调整View尺寸和全屏切换是提升用户体验的重要手段。理解并熟练运用这些技术,可以构建出高质量的视频播放应用。

    android之surfaceview学习示例

    在这个"android之surfaceview学习示例"中,我们将深入探讨SurfaceView的核心特性和使用方法。 首先,SurfaceView拥有自己的Surface对象,它位于窗口的最底层,直接与硬件交互,允许在主线程之外进行绘制操作,避免...

    android surfaceview 播放视频

    - 用户交互:添加播放/暂停按钮,进度条,全屏切换等。 - 视频控制:支持快进、快退、调整音量和亮度。 - 文件管理:支持选择本地或网络视频,播放列表管理。 - 编码格式支持:处理不同的视频编码格式,可能需要使用...

    android surfaceview 播放视频代码

    - MediaController:可以添加MediaController来提供视频播放的控制界面,如播放/暂停按钮、进度条等。 通过以上内容,你应该能够理解如何在Android应用中使用SurfaceView播放MP4视频,并具备实现这个功能的基础。...

    Android切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题的解决方法

    在Android开发中,SurfaceView是一种特殊的视图,用于处理高性能、低延迟的视频或图形渲染。在涉及到视频播放或者游戏等需要高效能画面更新的应用场景时,SurfaceView常常被使用。然而,使用SurfaceView时可能会遇到...

    AndroidSurfaceView添加组件view不被组件覆盖.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,比如游戏画面或者视频播放。然而,有时我们可能会遇到一个问题:当我们尝试在SurfaceView上添加其他组件时,这些...

    本示例使用 SurfaceView 播放视频

    在Android开发中,SurfaceView是一种特殊的视图,用于处理高性能的图形输出,如视频播放、游戏画面等。这个示例的重点在于如何利用SurfaceView和MediaPlayer组件来实现自定义位置和大小的视频播放功能。以下是对这个...

    采用surfaceView录制视频

    SurfaceView是一种特殊的View,它提供了一个可以在应用程序和系统渲染器之间显示独立的、全屏的、高性能的图形表面。在这个主题中,我们将深入探讨如何利用SurfaceView来实现视频录制。 首先,我们需要了解...

    android 集成VLC 流媒体视频播放Demo

    例如,添加播放/暂停按钮、进度条、全屏切换等功能。你可以使用VLCPlayer的回调方法来更新UI状态。 6. **处理错误和异常** 在实际开发中,需要考虑网络不稳定、文件不存在、格式不支持等各种情况。VLCPlayer会抛出...

    利用SurfaceView,Handler实现的带有音乐文字的图片浏览器

    在这个图片浏览器中,可能有一个后台服务负责播放音乐,而UI上的控件(如播放/暂停按钮)则通过Handler与服务进行通信,控制音乐的播放状态。 5. **集成与设计**: 将这些组件有效集成在一起,需要良好的架构设计...

    Android代码-支持全屏、小窗口的视频播放器

    在Android开发中,创建一个支持全屏和小窗口播放切换的视频播放器是常见的需求,特别是在构建媒体应用或者社交应用时。"NiceVieoPlayer"是一个专为此目的设计的开源项目,它允许用户在全屏模式和悬浮小窗口模式之间...

    WebView实现全屏播放

    【WebView实现全屏播放】是Android开发中一个重要的应用场景,主要涉及到如何在WebView中嵌入视频并实现全屏播放的功能。这一技术广泛应用于各种移动应用,例如社交媒体、在线教育平台等,让用户能够在不离开应用的...

    Android视频聊天窗口切换

    Android提供了SurfaceView和TextureView来显示视频流,它们各有优缺点,如SurfaceView性能较好,适合全屏播放,而TextureView支持更复杂的图像变换,适合多窗口或画中画模式。 6. **并发处理**:当多个视频聊天窗口...

    MediaPlayer SurfaceView

    在Android开发中,`MediaPlayer`和`SurfaceView`是实现网络视频播放的关键组件。`MediaPlayer`是Android系统提供的媒体播放器类,它支持多种音频和视频格式,包括网络流媒体。而`SurfaceView`则是一种特殊的视图,...

    Android高级应用源码-Android 视频浮动窗口源码.zip

    10. **用户交互**:为了提供良好的用户体验,源码可能包含了播放/暂停、全屏、音量控制等功能的按钮和手势识别。 11. **调试与日志**:源码中应包含适当的日志记录,帮助开发者在出现问题时调试代码。 通过分析和...

    Android视频播放器 支持列表,完美切换全屏、小窗口的 .zip

    在Android平台上开发一款功能完善的视频播放器,支持列表播放、无缝切换全屏和小窗口模式,是提升用户体验的重要环节。本文将深入探讨实现这一目标所需的关键技术和知识点。 1. **视频解码与渲染** - **硬件加速**...

    自定义Dialog中播放视频

    MediaController是Android提供的一个组件,它可以为视频播放提供控制界面,包括播放/暂停按钮、进度条等。我们可以通过以下方式实现: ```java SurfaceView surfaceView = findViewById(R.id.surface_view); ...

    android VideoView 全屏

    通过适当地配置布局和监听事件,可以实现全屏播放,同时结合`AudioManager` 和窗口属性,可以实现对音量和屏幕亮度的控制,提升用户体验。在实际开发中,还可以结合`MediaController` 为用户提供更丰富的交互界面。

    Android视频播放demo

    在Android平台上,开发一款视频播放应用是一项常见的任务。在这个名为"Android视频播放demo"的项目中,开发者提供了一个集成简单、调用方便的代码示例,帮助其他开发者快速理解和实现视频播放功能。该项目主要涉及两...

Global site tag (gtag.js) - Google Analytics