`

Android学习11-----多媒体技术(5) 媒体录制

阅读更多

       在Android中通过android.media.MeidaRecoder类实现音频和视频文件的录制操作。

 

 

 

MediaRecorder 的生命周期包括以下几种状态:

1、 Initial 状态 :当用户通过 MediaRecorder 类的构造方法实例化 MediaRecorder 类对象时将处于初始化状态,即便此时没有任何操作, MediaRecorder 也会占用系统资源,而所有的状态都可以通过 reset() 方法返回到此状态。

2、 Initialized 状态 :当用户使用 setAudioSource() setVideoSource() 方法后将进入音频录制或视频录制状态,并可以指定一些音频或视频的文件属性,设置完成之后将进入 DataSourceConfigured 状态。

3、 Prepared 状态 :就绪状态,当用户使用 MediaRecorder 类中的 prepare() 方法时进入就绪状态,表示录制前的状态已经准备就绪。

4、 Recoding 状态 :但用户使用 MediaRecorder 类中的 start() 方法时,将进入录制状态,并且一直持续到录音或录像操作完毕。

 

下面使用 MediaRecorder 完成一个音频录制以及音频文件列表

列表显示布局 --recordaudios.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TableRow>
		<ImageView
			android:id="@+id/icon" 
			android:layout_width="fill_parent"
			android:layout_height="wrap_content" 
			android:src="@drawable/audio_icon" />
		<TextView
			android:id="@+id/filename"
			android:textSize="16px"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
	</TableRow>
</TableLayout>

 

audiomain.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" 
		android:layout_width="fill_parent"
		android:layout_height="wrap_content">
		<ImageButton
			android:id="@+id/record"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:src="@drawable/record" />
		<ImageButton
			android:id="@+id/stop"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:src="@drawable/stop" />
	</LinearLayout>
	<TextView 
		android:id="@+id/info"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" 
		android:text="文字提示信息..." />
	<ListView
		android:id="@+id/reclist"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
</LinearLayout>

 

AudioRecorderActivity.java

package com.iflytek.demo;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class AudioRecorderActivity extends Activity {
	private ImageButton recordBtn = null;
	private ImageButton stopBtn = null;
	private TextView infoTxt = null;// 提示信息
	private ListView reclist = null;// 定义列表视图
	private SimpleAdapter recordSimpleAdapter = null;// 用于定义ListView组件的适配器
	private MediaRecorder mediaRecorder = null;// MediaRecorder对象
	private boolean sdcardExists = false; // 判断sd卡是否存在
	private File recordAudioSaveFileDir = null; // 保存所有音频文件的文件夹
	private File recordAudioSaveFile = null; // 每次保存音频文件的名称
	private String recordAudioSaveFileName = null; // 每次保存音频文件的名称
	private String recDir = "xdwangAudio"; // 文件保存的目录路径
	private boolean isRecord = false; // 判断是否正在录音
	private List<Map<String, Object>> recordFiles = null;// 保存所有的List数据

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.audiomain);
		this.recordBtn = (ImageButton) super.findViewById(R.id.record);
		this.stopBtn = (ImageButton) super.findViewById(R.id.stop);
		this.infoTxt = (TextView) super.findViewById(R.id.info);
		this.reclist = (ListView) super.findViewById(R.id.reclist);
		// 如果存在则将状态给了sdcardExists属性
		if ((this.sdcardExists = Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED))) { // 判断sd卡是否存在
			this.recordAudioSaveFileDir = new File(Environment
					.getExternalStorageDirectory().toString()
					+ File.separator
					+ AudioRecorderActivity.this.recDir + File.separator);// 保存录音目录
			if (!this.recordAudioSaveFileDir.exists()) { // 文件夹不存在
				this.recordAudioSaveFileDir.mkdirs(); // 创建新的文件夹
			}
		}
		this.stopBtn.setEnabled(false); // 暂停按钮暂时不可用
		this.getRecordFiles();// 取得全部的文件列表
		this.recordBtn.setOnClickListener(new RecordOnClickListenerImpl());
		this.stopBtn.setOnClickListener(new StopOnClickListenerImpl());
		this.reclist.setOnItemClickListener(new OnItemClickListenerImpl());
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-15 下午8:10:37
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 音频录制,默认格式为.3gp
	 * 
	 */
	private class RecordOnClickListenerImpl implements OnClickListener {

		@Override
		public void onClick(View v) {
			if (AudioRecorderActivity.this.sdcardExists) { // 如果sd卡存在
				AudioRecorderActivity.this.recordAudioSaveFileName = AudioRecorderActivity.this.recordAudioSaveFileDir
						.toString()
						+ File.separator
						+ "NoteRecord_"
						+ System.currentTimeMillis() + ".3gp"; // 每次的录音文件名称都不一样
				AudioRecorderActivity.this.recordAudioSaveFile = new File(
						AudioRecorderActivity.this.recordAudioSaveFileName);
				AudioRecorderActivity.this.mediaRecorder = new MediaRecorder(); // 实例化对象
				// 在进行录制之前必须配置若干个参数
				AudioRecorderActivity.this.mediaRecorder
						.setAudioSource(MediaRecorder.AudioSource.MIC); // 音频来源是MIC
				AudioRecorderActivity.this.mediaRecorder
						.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 定义输出格式
				AudioRecorderActivity.this.mediaRecorder
						.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); // 定义音频编码
				AudioRecorderActivity.this.mediaRecorder
						.setOutputFile(AudioRecorderActivity.this.recordAudioSaveFileName);// 定义输出文件
				try { // 进入到就绪状态
					AudioRecorderActivity.this.mediaRecorder.prepare();// 准备录音
				} catch (Exception e) {
					// Log.i("VideoRecorder", e.toString()) ;
				}
				AudioRecorderActivity.this.mediaRecorder.start(); // 开始录音
				AudioRecorderActivity.this.infoTxt.setText("正在录音中...");
				AudioRecorderActivity.this.stopBtn.setEnabled(true); // 停止录音按钮可以使用了
				AudioRecorderActivity.this.recordBtn.setEnabled(false);// 录音按钮禁用
				AudioRecorderActivity.this.isRecord = true; // 正在录音
			}
		}
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-15 下午8:48:15
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 暂停录音
	 * 
	 */
	private class StopOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			if (AudioRecorderActivity.this.isRecord) { // 正在录音
				AudioRecorderActivity.this.mediaRecorder.stop(); // 停止
				AudioRecorderActivity.this.mediaRecorder.release(); // 释放资源
				AudioRecorderActivity.this.recordBtn.setEnabled(true);// 录音按钮启用
				AudioRecorderActivity.this.stopBtn.setEnabled(false);// 停止录音按钮禁用
				AudioRecorderActivity.this.infoTxt.setText("录音结束,文件路径为:"
						+ AudioRecorderActivity.this.recordAudioSaveFileName);
				AudioRecorderActivity.this.getRecordFiles();// 重新加载列表
			}
		}
	}

	/**
	 * @descrption 取得全部录音文件
	 * @author xdwang
	 * @create 2012-11-15下午7:39:04
	 */
	private void getRecordFiles() { // 将一个文件夹之中的全部文件列出
		this.recordFiles = new ArrayList<Map<String, Object>>();
		if (this.sdcardExists) { // 如果sd卡存在
			File files[] = this.recordAudioSaveFileDir.listFiles(); // 列出目录中的文件
			for (int x = 0; x < files.length; x++) {
				Map<String, Object> fileInfo = new HashMap<String, Object>();
				fileInfo.put("filename", files[x].getName());// 增加显示内容
				this.recordFiles.add(fileInfo);// 保存数据
			}
			this.recordSimpleAdapter = new SimpleAdapter(this,
					this.recordFiles, R.layout.recordaudios,
					new String[] { "filename" }, new int[] { R.id.filename });// 实例化适配器
			this.reclist.setAdapter(this.recordSimpleAdapter);// 定义列表视图
		}
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-15 下午9:02:33
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 指定音频文件播放的操作
	 * 
	 */
	private class OnItemClickListenerImpl implements OnItemClickListener {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {// 选项单击
			if (AudioRecorderActivity.this.recordSimpleAdapter
					.getItem(position) instanceof Map) {// 判断是否是Map实例
				Map<?, ?> map = (Map<?, ?>) AudioRecorderActivity.this.recordSimpleAdapter
						.getItem(position);// 取出指定位置的内容
				Uri uri = Uri.fromFile(new File(
						AudioRecorderActivity.this.recordAudioSaveFileDir
								.toString()
								+ File.separator
								+ map.get("filename")));// 定义操作的Uri
				Intent intent = new Intent(Intent.ACTION_VIEW);// 指定Action
				intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 增加标记
				intent.setDataAndType(uri, "audio/mp3");// 设置数据播放的MIME
				AudioRecorderActivity.this.startActivity(intent);// 启动Activity
			}
		}
	}
}
 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.iflytek.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".AudioRecorderActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 

录制视频与录制音频文件的功能类似,唯一的区别就是在视频录制中需要定义一个额外的SurfaceView组件,以捕获摄像头采集到的数据。
范例:视频录制、列表显示、视频播放
recordvideo.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" 
		android:layout_width="wrap_content"
		android:layout_height="wrap_content">
		<ImageButton
			android:id="@+id/record"
			android:layout_width="wrap_content"
			android:layout_height="fill_parent" 
			android:src="@drawable/record"/>
		<ImageButton
			android:id="@+id/stop"
			android:layout_width="wrap_content"
			android:layout_height="fill_parent" 
			android:src="@drawable/stop"/>
		<ImageButton
			android:id="@+id/browser"
			android:layout_width="wrap_content"
			android:layout_height="fill_parent" 
			android:src="@drawable/browser"/>
	</LinearLayout>
	<TextView 
		android:id="@+id/info"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content" 
		android:text="文字提示信息" />
	<SurfaceView
		android:id="@+id/surface"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" />
</LinearLayout>
 

VideoRecorderActivity.java

package com.iflytek.demo;

import java.io.File;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.TextView;

public class VideoRecorderActivity extends Activity {

	private ImageButton recordBtn = null;
	private ImageButton stopBtn = null;
	private ImageButton browserBtn = null;
	private TextView infoTxt = null;
	private MediaRecorder mediaRecorder = null;
	private File recordVideoSaveFile = null;// 文件保存目录路径
	private File recordVideoSaveFileDir = null;// 文件保存目录
	private String recordVideoSaveFileName = null;// 音频文件保存名称
	private String recDir = "xdwangvideo";// 保存目录
	private boolean sdcardExists = false; // SD卡存在的标记
	private boolean isRecord = false;// 判断是否正在录音
	private SurfaceView surfaceView = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.requestWindowFeature(Window.FEATURE_NO_TITLE); // 不显示标题
		super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
		super.getWindow().addFlags(
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 高亮的风格显示
		super.setContentView(R.layout.recordvideo);
		this.recordBtn = (ImageButton) super.findViewById(R.id.record);
		this.stopBtn = (ImageButton) super.findViewById(R.id.stop);
		this.browserBtn = (ImageButton) super.findViewById(R.id.browser);
		this.infoTxt = (TextView) super.findViewById(R.id.info);
		this.surfaceView = (SurfaceView) super.findViewById(R.id.surface);
		this.surfaceView.getHolder().setType(
				SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置缓冲类型
		this.surfaceView.getHolder().setFixedSize(480, 800);//设置分辨率
		if ((this.sdcardExists = Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED))) {//判断sd卡是否存在
			this.recordVideoSaveFileDir = new File(Environment
					.getExternalStorageDirectory().toString()
					+ File.separator
					+ VideoRecorderActivity.this.recDir + File.separator); // 保存录音目录
			if (!this.recordVideoSaveFileDir.exists()) {
				this.recordVideoSaveFileDir.mkdirs(); // 创建新文件夹
			}
		}
		this.recordBtn.setOnClickListener(new RecordOnClickListenerImpl());
		this.stopBtn.setOnClickListener(new StopOnClickListenerImpl());
		this.browserBtn
				.setOnClickListener(new BrowserOnClickListenerImpl());
		this.stopBtn.setEnabled(false); // 停止录象的按钮暂时不可用
	}

	/**
	 * 
	 * @author xdwang 
	 *
	 * @create 2012-11-15 下午09:25:32
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 视频录制
	 *
	 */
	private class RecordOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			if (VideoRecorderActivity.this.sdcardExists) { // sd卡存在
				VideoRecorderActivity.this.recordVideoSaveFileName = VideoRecorderActivity.this.recordVideoSaveFileDir
						.toString()
						+ File.separator
						+ "XdwangVideo_"
						+ System.currentTimeMillis() + ".3gp";// 文件的路径名称

				VideoRecorderActivity.this.recordVideoSaveFile = new File(
						VideoRecorderActivity.this.recordVideoSaveFileName);// 文件路径
				VideoRecorderActivity.this.mediaRecorder = new MediaRecorder();
				VideoRecorderActivity.this.mediaRecorder.reset(); // 重置
				VideoRecorderActivity.this.mediaRecorder
						.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 设置视频源,从摄像头来
				VideoRecorderActivity.this.mediaRecorder
						.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置音频源,表示从麦克风进来
				VideoRecorderActivity.this.mediaRecorder
						.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
				VideoRecorderActivity.this.mediaRecorder
						.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// 设置录制的视频编码h263
																			// h264,注意这里如果写H263会出现错误
				VideoRecorderActivity.this.mediaRecorder
						.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 设置音频的编码
				VideoRecorderActivity.this.mediaRecorder
						.setOutputFile(VideoRecorderActivity.this.recordVideoSaveFileName);// 设置视频保存路径

				Camera camera = Camera.open(0); // 取得第一个摄像头,可能存在多个,0表示后面的,1表示前置摄像头
				Parameters parameters = camera.getParameters();
				List<Camera.Size> previewSizes = parameters
						.getSupportedPreviewSizes();
				Camera.Size pictureSize = previewSizes.get(0);

				VideoRecorderActivity.this.mediaRecorder.setVideoSize(
						pictureSize.width, pictureSize.height);// 视频分辨率

				// WindowManager wm = (WindowManager)
				// getSystemService(Context.WINDOW_SERVICE);
				// // 获取窗口服务
				// Display display = wm.getDefaultDisplay();// 获取屏幕信息
				// VideoRecorderActivity.this.mediaRecorder.setVideoSize(
				// display.getWidth(), display.getHeight());// 视频分辨率
				VideoRecorderActivity.this.mediaRecorder.setVideoFrameRate(10);// 设置每秒为10帧
				// 必须放在设置编码和格式的后面,否则报错
				VideoRecorderActivity.this.mediaRecorder
						.setPreviewDisplay(VideoRecorderActivity.this.surfaceView
								.getHolder().getSurface());// 定义视频显示
				try {
					VideoRecorderActivity.this.mediaRecorder.prepare();// 准备录像
				} catch (Exception e) {
					Log.i("VideoRecorderActivity", e.toString());
				}
				VideoRecorderActivity.this.mediaRecorder.start();// 开始录像
				VideoRecorderActivity.this.infoTxt.setText("正在录象中...");
				VideoRecorderActivity.this.stopBtn.setEnabled(true);
				VideoRecorderActivity.this.recordBtn.setEnabled(false);
				VideoRecorderActivity.this.isRecord = true;// 正在录像
			}
		}
	}

	/**
	 * 
	 * @author xdwang 
	 *
	 * @create 2012-11-15 下午09:30:23
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 停止录制视频
	 *
	 */
	private class StopOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			if (VideoRecorderActivity.this.isRecord) {
				VideoRecorderActivity.this.mediaRecorder.stop();

				VideoRecorderActivity.this.mediaRecorder.release();
				VideoRecorderActivity.this.stopBtn.setEnabled(false);
				VideoRecorderActivity.this.recordBtn.setEnabled(true);
				VideoRecorderActivity.this.infoTxt.setText("录象结束,文件路径为:"
						+ VideoRecorderActivity.this.recordVideoSaveFile);
			}
		}
	}

	/**
	 * 
	 * @author xdwang 
	 *
	 * @create 2012-11-15 下午09:36:36
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description Activity跳转
	 *
	 */
	private class BrowserOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			Intent intent = new Intent(VideoRecorderActivity.this,
					BroswerActivity.class);
			VideoRecorderActivity.this.startActivity(intent);
		}
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			super.finish();
		}
		return false;
	}

}
 

recordfiles.xml(BroswerActivity 程序进行ListView显示)

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TableRow>
		<ImageView
			android:id="@+id/icon" 
			android:layout_width="fill_parent"
			android:layout_height="wrap_content" 
			android:src="@drawable/video_icon" />
		<TextView
			android:id="@+id/filename"
			android:textSize="25px"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
	</TableRow>
</TableLayout>

 

broswer.xml(BroswerActivity布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" 
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:gravity="center">
		<TextView 
			android:id="@+id/info"
			android:textSize="25px"
			android:gravity="center"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" 
			android:text="视频文件列表" />
		<ImageButton
			android:id="@+id/back"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" 
			android:src="@drawable/back"/>
	</LinearLayout>
	<ListView
		android:id="@+id/videolist"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" />
</LinearLayout>
 

BroswerActivity.java

package com.iflytek.demo;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;

/**
 * @author xdwang
 * 
 * @create 2012-11-15 下午10:15:22
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description 视频文件浏览的Activity操作,提供ListView显示
 * 
 */

public class BroswerActivity extends Activity {
	private ImageButton backBtn = null;
	private ListView videolist = null;// 定义列表视图
	private SimpleAdapter recordSimpleAdapter = null;// 适配器
	private List<Map<String, Object>> recordFiles = null;// 保存所有的List数据
	private String recDir = "xdwangvideo";// 保存目录
	private File recordVideoSaveFileDir = null;// 文件保存目录
	private boolean sdcardExists = false;// sd卡是否存在

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.requestWindowFeature(Window.FEATURE_NO_TITLE); // 不显示标题
		super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		super.getWindow().addFlags(
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 高亮的风格显示
		super.setContentView(R.layout.broswer);
		if ((this.sdcardExists = Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED))) {
			this.recordVideoSaveFileDir = new File(Environment
					.getExternalStorageDirectory().toString()
					+ File.separator
					+ BroswerActivity.this.recDir + File.separator);
			if (!this.recordVideoSaveFileDir.exists()) {
				this.recordVideoSaveFileDir.mkdirs();
			}
		}
		this.backBtn = (ImageButton) super.findViewById(R.id.back);
		this.videolist = (ListView) super.findViewById(R.id.videolist);
		this.getRecordFiles();// 取得全部的文件列表
		this.videolist.setOnItemClickListener(new OnItemClickListenerImpl());
		this.backBtn.setOnClickListener(new BackOnClickListenerImpl());
	}

	/**
	 * @descrption 加载给定目录中的全部文件
	 * @author xdwang
	 * @create 2012-11-15下午10:26:55
	 */
	private void getRecordFiles() {// 取得全部录音文件
		this.recordFiles = new ArrayList<Map<String, Object>>();
		if (this.sdcardExists) {
			File files[] = this.recordVideoSaveFileDir.listFiles();
			for (int x = 0; x < files.length; x++) {
				Map<String, Object> fileInfo = new HashMap<String, Object>();
				fileInfo.put("filename", files[x].getName());// 增加显示内容
				this.recordFiles.add(fileInfo);// 保存数据
			}
			this.recordSimpleAdapter = new SimpleAdapter(this,
					this.recordFiles, R.layout.recordfiles,
					new String[] { "filename" }, new int[] { R.id.filename });// 实例化适配器
			this.videolist.setAdapter(this.recordSimpleAdapter);// 定义列表视图
		}
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-15 下午10:37:23
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 返回操作
	 * 
	 */
	private class BackOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			Intent it = new Intent(BroswerActivity.this,
					VideoRecorderActivity.class);
			BroswerActivity.this.startActivity(it);
		}
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-15 下午10:43:41
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 单击视频选项进行播放
	 * 
	 */
	private class OnItemClickListenerImpl implements OnItemClickListener {
		@Override
		public void onItemClick(AdapterView<?> adapter, View view,
				int position, long id) {// 选项单击
			if (BroswerActivity.this.recordSimpleAdapter.getItem(position) instanceof Map) {// 判断是否是Map实例
				Map<?, ?> map = (Map<?, ?>) BroswerActivity.this.recordSimpleAdapter
						.getItem(position);// 取得指定位置的内容
				Intent intent = new Intent(BroswerActivity.this,
						PlayVideoActivity.class);// 指定Intent
				intent.putExtra("filepath",
						BroswerActivity.this.recordVideoSaveFileDir.toString()
								+ File.separator
								+ map.get("filename").toString());
				BroswerActivity.this.startActivity(intent);// 启动Activity
			}
		}

	}
}

 

play.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" 
	android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<LinearLayout 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" 
		android:layout_width="wrap_content"
		android:layout_height="wrap_content">
		<ImageButton
			android:id="@+id/play"
			android:layout_width="wrap_content"
			android:layout_height="fill_parent" 
			android:src="@drawable/play"/>
		<ImageButton
			android:id="@+id/stop"
			android:layout_width="wrap_content"
			android:layout_height="fill_parent" 
			android:src="@drawable/stop"/>
		<ImageButton
			android:id="@+id/back"
			android:layout_width="wrap_content"
			android:layout_height="fill_parent" 
			android:src="@drawable/back"/>
	</LinearLayout>
	<SurfaceView
		android:id="@+id/surfaceView"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent" />
</LinearLayout>
 

PlayVideoActivity.java

package com.iflytek.demo;

import android.app.Activity;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;

/**
 * @author xdwang
 * 
 * @create 2012-11-15 下午10:50:57
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description 播放视频的Activity,使用Mediaplayer完成播放
 * 
 */
public class PlayVideoActivity extends Activity {
	private ImageButton playBtn = null;
	private ImageButton stopBtn = null;
	private ImageButton backBtn = null;
	private MediaPlayer mediaPlayer = null;
	private SurfaceView sufaceView = null;
	private SurfaceHolder surfaceHolder = null;
	private String filepath = null;// 播放文件路径

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.requestWindowFeature(Window.FEATURE_NO_TITLE); // 不显示标题
		super.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		super.getWindow().addFlags(
				WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 高亮的风格显示
		super.setContentView(R.layout.play);

		this.filepath = super.getIntent().getStringExtra("filepath");

		this.playBtn = (ImageButton) super.findViewById(R.id.play);
		this.stopBtn = (ImageButton) super.findViewById(R.id.stop);
		this.backBtn = (ImageButton) super.findViewById(R.id.back);
		this.sufaceView = (SurfaceView) super.findViewById(R.id.surfaceView);
		this.surfaceHolder = this.sufaceView.getHolder();
		this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 设置SurfaceView类型
		this.mediaPlayer = new MediaPlayer();
		this.mediaPlayer.reset();// 重置操作
		try {
			this.mediaPlayer.setDataSource(this.filepath);// 设置播放文件的路径
		} catch (Exception e) {
		}

		this.playBtn.setOnClickListener(new PlayOnClickListenerImpl());
		this.stopBtn.setOnClickListener(new StopOnClickListenerImpl());
		this.backBtn.setOnClickListener(new BackOnClickListenerImpl());
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-14 下午10:57:56
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 视频播放
	 * 
	 */
	private class PlayOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			PlayVideoActivity.this.mediaPlayer
					.setAudioStreamType(AudioManager.STREAM_MUSIC);// 设置音频类型
			PlayVideoActivity.this.mediaPlayer
					.setDisplay(PlayVideoActivity.this.surfaceHolder);// 设置显示区域
			try {
				PlayVideoActivity.this.mediaPlayer.prepare();// 预备状态
				PlayVideoActivity.this.mediaPlayer.start();// 播放视频
			} catch (Exception e) {
			}
		}
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-15 下午10:59:06
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 暂停视频
	 * 
	 */
	private class StopOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			PlayVideoActivity.this.mediaPlayer.stop();// 停止播放
		}
	}

	/**
	 * 
	 * @author xdwang
	 * 
	 * @create 2012-11-15下午11:03:16
	 * 
	 * @email:xdwangiflytek@gmail.com
	 * 
	 * @description 返回
	 * 
	 */
	private class BackOnClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			Intent it = new Intent(PlayVideoActivity.this,
					BroswerActivity.class);
			PlayVideoActivity.this.startActivity(it);
		}
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			this.mediaPlayer.stop();
			this.mediaPlayer.release();
			super.finish();
		}
		return false;
	}
}

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.iflytek.demo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".VideoRecorderActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".BroswerActivity"
            android:screenOrientation="landscape" />
        <activity
            android:name="PlayVideoActivity"
            android:screenOrientation="landscape" />
    </application>

</manifest>
  • 大小: 20.6 KB
分享到:
评论

相关推荐

    Pro.Android.Media--Android多媒体开发白皮书

    本书由Shawn VanEvery编写,详细介绍了如何使用Android多媒体API创建动态移动应用,包括图形、音乐、视频及富媒体应用程序的开发方法。 ### 一、Android多媒体API概述 #### 1. Android多媒体API的重要性 Android...

    Android代码-安卓多媒体测试集合

    通过这个测试集合,开发者不仅可以学习到Android多媒体功能的基本用法,还能深入了解如何优化性能、处理异常情况,以及如何与其他系统服务协同工作。这对于开发高质量的Android多媒体应用至关重要。

    Android多媒体开发高级编程-5

    本篇将深入探讨Android多媒体开发的高级编程技术,帮助开发者掌握如何在Android应用中集成丰富的媒体功能。 1. **多媒体框架** Android提供了一个强大的多媒体框架,包括Media Framework,它由多个组件构成,如...

    Android--开发--【eoeAndroid--开发--特刊】第15期:Android--开发--多媒体.rar

    以下是对Android多媒体开发的详细介绍: 1. **多媒体文件支持**:Android支持多种多媒体文件格式,如MP3、AAC、WAV(音频)、MP4、3GP、WebM(视频)以及JPEG、PNG、GIF、BMP(图像)。Android Media Framework是...

    Android 多媒体技术Demo

    这些是Android多媒体技术的基础知识点,开发者通常会结合这些API和工具来实现丰富的多媒体应用功能。在实际开发中,还需要考虑性能优化、内存管理以及不同设备的兼容性等问题。如果博客中包含了具体的示例代码,那么...

    Android多媒体设计教程 Android多媒体设计教程

    本教程详细介绍了Android多媒体框架的基本构成及其核心组件OpenCore平台的工作原理和技术细节。通过这些知识点的学习,开发者可以更好地理解Android如何处理多媒体数据,以及如何利用Android提供的多媒体API来实现...

    Android多媒体开发04-框架.ppt

    【Android多媒体框架与开发应用框架】 在Android系统中,多媒体框架是实现音频、视频和图像处理的核心组件,而应用框架则是开发者构建应用程序的基础。本文将深入解析这两个关键领域的概念和工作原理。 一、...

    Android多媒体构架分析

    从文件内容中提到的“英本交于内部资料”,我们可能推断这是一个内部文档,它应该包含了关于ICS版本Android多媒体构架详细的技术信息。虽然这部分内容并没有提供详细的技术细节,但它表明这份资料是为内部人员提供的...

    Android--多媒体架构[参照].pdf

    总的来说,Android的多媒体架构和OpenMAX技术共同构建了一个高效、灵活且可扩展的多媒体处理系统,允许开发者创建各种多媒体应用,包括播放、录制、流媒体、视频会议等,同时确保在不同硬件和软件环境下的兼容性和...

    Android--开发--的多媒体框架OpenCore介绍.rar

    尽管OpenCore在现代Android版本中的地位已经被新框架取代,但理解其工作原理对于深入学习Android多媒体处理仍然具有价值。OpenCore的模块化设计和处理流程为后来的多媒体框架提供了很好的参考和基础。 总的来说,...

    android多媒体学习代码

    这个“android多媒体学习代码”压缩包包含了一系列的示例项目,帮助开发者深入理解如何在Android应用中处理图像、音频、视频以及利用绘图和动画功能。下面将详细介绍这些知识点。 1. **Android绘图**: Android...

    android的多媒体系统.pdf

    Android多媒体系统架构复杂,包含了多个层级,主要包括: - **应用层**: 包括用户界面以及应用程序,例如音乐播放器、视频播放器等。 - **Java框架**: 提供了多媒体相关的Java API,例如`android.media.*`类。 - **...

    polycom-android-phone-release-3.10.1-71327.zip

    5. **日程集成**:可能与Google日历或其他日程管理工具集成,方便安排和提醒会议。 6. **安全特性**:为保障会议隐私和信息安全,应用可能内置了加密技术,如SSL/TLS等。 7. **多语言支持**:为了满足全球用户需求,...

    Android的多媒体框架

    下面将详细介绍Android多媒体框架的相关知识点。 一、多媒体框架结构 1. 库层:这是多媒体框架的基础,包含了各种编解码器库,如AAC、MP3、H.264等,它们负责音频和视频数据的编码和解码工作。此外,还包括OpenMAX...

    android-11-cdd.pdf

    文档《android-11-cdd.pdf》是关于Android 11平台的兼容性定义文件(Compatibility Definition Document,简称CDD),由Google LLC于2021年更新。该文档详细规定了不同设备类型在Android 11版本上需要满足的硬件、...

    Android多媒体开发高级编程

    本节将深入探讨Android多媒体开发的高级编程技巧,帮助开发者实现更高效、更丰富的多媒体应用。 1. **多媒体框架概述** Android的多媒体框架基于开放移动联盟(OMA)的开放移动 Alliance Digital Media ...

    Android多媒体开发高级编程-电子书

    《Android多媒体开发高级编程》是一本深入探讨Android平台多媒体应用开发的专业书籍,旨在帮助开发者提升在Android系统上创建高效、高质量的多媒体应用的能力。PDF格式的电子书版本使得读者可以随时随地进行学习,不...

    Android的多媒体框架OpenCore介绍.zip

    总之,OpenCore是Android多媒体系统的重要组成部分,它的设计和实现直接影响到Android设备的多媒体性能和用户体验。通过对OpenCore的深入学习,开发者可以更好地理解和利用Android的多媒体框架,创造出更加丰富和...

Global site tag (gtag.js) - Google Analytics