- 浏览: 1204768 次
- 性别:
- 来自: 荆州
文章分类
- 全部博客 (396)
- Android 基础 (72)
- Java 基础 (42)
- Android(动画效果) (26)
- Android(自定义组件) (13)
- Android(手机服务) (38)
- Android(网络相关) (27)
- Android(多媒体) (12)
- Android(小技巧) (30)
- Android(用户界面) (39)
- 基础概念 (24)
- Android组件学习 (21)
- Android数据库相关 (11)
- 生活杂谈 (10)
- 调试技巧部分 (8)
- Sql Server相关 (1)
- Android(xml相关) (2)
- Android 开发 (12)
- 韩语学习 (4)
- Mac添加环境变量的三种方法 (1)
- iPhone开发 (1)
- Android Studio (1)
最新评论
-
ppfbsar:
下载网络文件到SD卡上 -
851228082:
好文!彻底理解单类型导入与按需导入的区别了。还有一点可以通过 ...
谈java的导入(import) -
麦田的设计者:
老乡啊
sqlite 数据库保存图片 -
sf_dream:
我要是读写list、map之类的集合呢
ObjectOutputStream和ObjectInputStream类的学习 -
xfyunyun:
博主,请问webview加载html字符串时怎么进行缓存处理呢 ...
WebView使用总结2(加载HTML内容形式的String)
1.上代码:
package irdc.ex08_15; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import android.app.Activity; import android.graphics.PixelFormat; import android.media.MediaPlayer; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.webkit.URLUtil; import android.widget.EditText; import android.widget.ImageButton; import android.widget.TextView; /* Activity实现SurfaceHolder.Callback */ public class PlayUrlVideo extends Activity implements SurfaceHolder.Callback { private TextView mTextView01; private EditText mEditText01; /* 创建MediaPlayer对象 */ private MediaPlayer mMediaPlayer01; /* 用以显示MediaPlayer的SurfaceView */ private SurfaceView mSurfaceView01; /* SurfaceHolder对象 */ private SurfaceHolder mSurfaceHolder01; //视频控制的几个按钮 private ImageButton mPlay, mReset, mPause, mStop; /* 识别MediaPlayer是否已被释放 */ private boolean bIsReleased = false; /* 识别MediaPlayer是否正处于暂停 */ private boolean bIsPaused = false; /* LogCat输出TAG filter */ private static final String TAG = "*****MediaPlayer*****"; private String currentFilePath = ""; //保存下载文件临时路径 private String currentTempFilePath = ""; private String strVideoURL = ""; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* 将.3gp图像文件存放URL网址 */ strVideoURL = "http://www.dubblogs.cc:8751/Android/Test/Media/3gp/test.3gp"; mTextView01 = (TextView) findViewById(R.id.myTextView1); mEditText01 = (EditText) findViewById(R.id.myEditText1); mEditText01.setText(strVideoURL); /* 绑定Layout上的SurfaceView */ mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1); // 这句我还看出到底起什么作用 getWindow().setFormat(PixelFormat.TRANSPARENT); /* 设置SurfaceHolder为Layout SurfaceView */ mSurfaceHolder01 = mSurfaceView01.getHolder(); mSurfaceHolder01.addCallback(this); // 影片指定其为固定比例 mSurfaceHolder01.setFixedSize(160, 128); mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mPlay = (ImageButton) findViewById(R.id.play); mReset = (ImageButton) findViewById(R.id.reset); mPause = (ImageButton) findViewById(R.id.pause); mStop = (ImageButton) findViewById(R.id.stop); /* 播放按钮 */ mPlay.setOnClickListener(new ImageButton.OnClickListener() { public void onClick(View view) { //判断SD卡是否存在 if (checkSDCard()) { strVideoURL = mEditText01.getText().toString(); //开始下载video playVideo(strVideoURL); mTextView01.setText(R.string.str_play); } else { mTextView01.setText(R.string.str_err_nosd); } } }); /* 重新播放按钮 */ mReset.setOnClickListener(new ImageButton.OnClickListener() { public void onClick(View view) { if (checkSDCard()) { if (bIsReleased == false) { if (mMediaPlayer01 != null) { //回到起始点开始重新播放 mMediaPlayer01.seekTo(0); mTextView01.setText(R.string.str_play); } } } else { mTextView01.setText(R.string.str_err_nosd); } } }); /* 暂停按钮 */ 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; mTextView01.setText(R.string.str_pause); } else if (bIsPaused == true) { mMediaPlayer01.start(); bIsPaused = false; mTextView01.setText(R.string.str_play); } } } } else { mTextView01.setText(R.string.str_err_nosd); } } }); /* 终止按钮 */ mStop.setOnClickListener(new ImageButton.OnClickListener() { public void onClick(View view) { if (checkSDCard()) { try { if (mMediaPlayer01 != null) { if (bIsReleased == false) { mMediaPlayer01.seekTo(0); mMediaPlayer01.pause(); mTextView01.setText(R.string.str_stop); } } } catch (Exception e) { mTextView01.setText(e.toString()); Log.e(TAG, e.toString()); e.printStackTrace(); } } else { mTextView01.setText(R.string.str_err_nosd); } } }); } /* 自定义下载URL影片并播放 */ private void playVideo(final String strPath) { try { /* 若传入的strPath为现有播放的连接,则直接播放 */ if (strPath.equals(currentFilePath) && mMediaPlayer01 != null) { mMediaPlayer01.start(); return; } else if (mMediaPlayer01 != null) { mMediaPlayer01.stop(); } currentFilePath = strPath; /* 重新构建MediaPlayer对象 */ mMediaPlayer01 = new MediaPlayer(); /* 设置播放音量 */ mMediaPlayer01.setAudioStreamType(2); /* 设置显示于SurfaceHolder */ mMediaPlayer01.setDisplay(mSurfaceHolder01); mMediaPlayer01.setOnErrorListener(new MediaPlayer.OnErrorListener() { // @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub Log.i(TAG, "Error on Listener, what: " + what + "extra: " + extra); return false; } }); mMediaPlayer01 .setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { // @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // TODO Auto-generated method stub Log.i(TAG, "Update buffer: " + Integer.toString(percent) + "%"); } }); mMediaPlayer01 .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub Log.i(TAG, "mMediaPlayer01 Listener Completed"); mTextView01.setText(R.string.str_done); } }); mMediaPlayer01.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { // @Override public void onPrepared(MediaPlayer mp) { // TODO Auto-generated method stub Log.i(TAG, "Prepared Listener"); } }); Runnable r = new Runnable() { public void run() { try { /* 在线程运行中,调用自定义函数下载 */ setDataSource(strPath); /* 下载完后才会调用prepare */ mMediaPlayer01.prepare(); Log.i(TAG, "Duration: " + mMediaPlayer01.getDuration()); mMediaPlayer01.start(); bIsReleased = false; } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } } }; //新开启一个线程进行视频下载(增强用户体验) new Thread(r).start(); } catch (Exception e) { if (mMediaPlayer01 != null) { mMediaPlayer01.stop(); mMediaPlayer01.release(); } } } /* 自定义setDataSource,由线程启动 */ private void setDataSource(String strPath) throws Exception { //判断地址是否合法 if (!URLUtil.isNetworkUrl(strPath)) { //这里理解为不是合法网址,就传递的local地址 mMediaPlayer01.setDataSource(strPath); } else { if (bIsReleased == false) { URL myURL = new URL(strPath); URLConnection conn = myURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); //这里可以通过conn.getContentLength()来识别源字节大小,便于添加下载进度条 if (is == null) { throw new RuntimeException("stream is null"); } //获取文件名扩展名,创建临时文件 File myFileTemp = File.createTempFile("hippoplayertmp", "." + getFileExtension(strPath)); //获取文件绝对路径 currentTempFilePath = myFileTemp.getAbsolutePath(); /* currentTempFilePath = /sdcard/mediaplayertmp39327.dat */ //构建一个输出流写文件 FileOutputStream fos = new FileOutputStream(myFileTemp); byte buf[] = new byte[128]; do { int numread = is.read(buf); if (numread <= 0) { break; } fos.write(buf, 0, numread); } while (true); //下载完成进行MediaPlayer源设置 mMediaPlayer01.setDataSource(currentTempFilePath); try { is.close(); } catch (Exception ex) { Log.e(TAG, "error: " + ex.getMessage(), ex); } } } } //获取下载文件后缀名 private String getFileExtension(String strFileName) { File myFile = new File(strFileName); String strFileExtension = myFile.getName(); strFileExtension = (strFileExtension.substring(strFileExtension .lastIndexOf(".") + 1)).toLowerCase(); if (strFileExtension == "") { /* 若无法顺利取得扩展名,默认为.dat */ strFileExtension = "dat"; } return strFileExtension; } private boolean checkSDCard() { /* 判断存储卡是否存在 */ if (android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) { return true; } else { return false; } } // @Override public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w, int h) { // TODO Auto-generated method stub Log.i(TAG, "Surface Changed"); } // @Override public void surfaceCreated(SurfaceHolder surfaceholder) { // TODO Auto-generated method stub Log.i(TAG, "Surface Changed"); } // @Override public void surfaceDestroyed(SurfaceHolder surfaceholder) { // TODO Auto-generated method stub Log.i(TAG, "Surface Changed"); } //当程序停止后,进行MediaPlayer的资源释放操作 @Override protected void onStop() { super.onStop(); if (mMediaPlayer01 != null) { mMediaPlayer01.stop(); mMediaPlayer01.release(); } this.finish(); } }
2.main.xml文件内容比较简单
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/white" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/myTextView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="@drawable/blue" android:text="@string/hello" /> <EditText android:id="@+id/myEditText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:singleLine="True" /> <SurfaceView android:id="@+id/mSurfaceView1" android:visibility="visible" android:layout_width="320px" android:layout_height="240px"> </SurfaceView> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="fill_parent" android:padding="10dip"> <ImageButton android:id="@+id/play" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/play" /> <ImageButton android:id="@+id/pause" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/pause" /> <ImageButton android:id="@+id/reset" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/reset" /> <ImageButton android:id="@+id/stop" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/stop" /> </LinearLayout> </LinearLayout>
3.注意配置文件权限添加
<uses-permission android:name="android.permission.INTERNET"> </uses-permission>
部分color.xml文件颜色初始化以及strings.xml中的我这里就不附上了
发表评论
-
Android 图片占用内存与什么有关
2013-05-02 21:51 1851在开发手机应用的时候,内存是有限的,那使用的时候,就要 ... -
AudioTrack学习
2012-01-30 16:55 1953AudioTrack主要是用来播放声音的,AudioTrack ... -
系统相册和拍照图片进行裁剪保存
2011-12-07 11:54 2247直接上例子吧,折腾了一上午,就整理出这点东西,这年头,知识挺贵 ... -
Camera的一些相关例子网站
2010-09-15 11:01 11121. http://www.tomgibara.com/and ... -
弹钢琴的一个简单程序(UI很重要)
2010-08-14 22:57 3970效果图: package com.example; ... -
Audio and Video
2010-08-06 15:27 1456Android平台提供了对多种常见多媒体的编码,解码功能,以便 ... -
Android进行录音播放1(存储到指定文件夹)
2010-07-29 23:16 13533这个开发范例大全上的一个例子: 贴出来给大家分享: EX07_ ... -
调用系统录像功能
2010-07-29 22:57 2504这个还不是很熟悉,在试验了下后,贴出简单Demo: Media ... -
使用SD卡上图片资源的ImageView
2010-07-26 15:13 1857这个主要是实现Bitmap和Drawable之间的转换以及SD ... -
Android调用系统播放器
2010-07-20 19:59 5525直接用这段代码就可以了: package cn.com; ... -
VideoView播放SD卡上视频的例子
2010-06-22 19:03 10804先上代码: package cn.com; impo ...
相关推荐
Android下使用SurfaceView播放视频文件,详细参见博客:http://www.cnblogs.com/plokmju/p/android_SurfaceView.html
surfaceview播放网络视频 线程播放 添加handler传递消息
一个播放本地视频的播放器,可供使用和学习。 实现功能: 1、搜索制定目录下的本地视频,并显示缩略图及视频名称在列表上;2、点击播放指定视频或按顺序播放全部... 本地视频搜索 视频播放 SurfaceView RecycleView fab
使用VideoView播放视频简单、方便,但有些早期的开发者还是更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时就需要借助于SurfaceView来显示MediaPlayer播放...
介绍了使用MediaPlayer播放音频,实际上,MediaPlayer还可以用来播放视频文件,只不过使用MediaPlayer播放视频时,没有提供图像输出界面。这时,可以使用SurfaceView组件来...使用MediaPlayer和SurfaceView播放视频....
用MediaPlayer和SurfaceView写的视频播放器,利用系统自带的编解码功能,具备播放、暂停、停止功能,支持旋转屏幕,在发生屏幕旋转、Activity切换等事件之后,能记住之前的播放状态和播放进度,界面比较简单,仅供...
android的仿微信视频录制播放,自定义了一个视频录制控件,运用了计时器、录制完成回调接口实现了微信中发小视频的10秒视频录制功能,以mp4的视频格式存放在本地。拥有进度条、摄像头控制、竖屏录制、视频录制格式、...
这个是我改进了SurfaceView一个例子做的,参考了前人的作品,更适合我的项目使用了,如果对大家有帮助可以试试看
本示例使用 SurfaceView 播放视频,它可以使播放的位置和大小受我们的控制,使用MediaPlayer 配合 SurfaceView 来播放视频
使用SurfaceView播放本地视频,注意本地视频路径要和代码中一致,在手机权限管理中加入读取本地文件的权限
一个播放本地视频的播放器,可供使用和学习。 实现功能: 1、搜索制定目录下的本地视频,并显示缩略图及视频名称在列表上;2、点击播放指定视频或按顺序播放全部视频;3、包括进度条,播放和暂停键,时间显示等控件...
SurfaceView+MediaPlayer视频播放,包含小窗口和全屏播放
android平台上使用surfaceview成功播放视频,可扩展制作成视屏播放器
listview+surfaceview视频播放
android surfaceview播放视频文件。MP4格式视频。
SurfaceView播放视频放大缩小功能
该代码主要是使用SurfaceView播放视频的例子,该视频放于assets目录下,读取该目录的视频文件,进行播放
listview嵌套surfaceview,播放视频。 可在此github地址,下载更多Demo: https://github.com/RealMoMo/Study_Android_Demo
Android视频播放:SurfaceView+MediaPlayer播放视频http://blog.csdn.net/bing054/article/details/51195175
使用MediaPlayer和SurfaceView播放视频. 使用MediaPlayer播放视频的步骤 1、创建MediaPlyer的对象,并让他加载指定的视频文件。 2、在界面布局文件中定义SurfaceView组件,或在程序中创建SurfaceView组件。并为...