`
梦想家dream
  • 浏览: 64205 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Android从零开始—多媒体(二十二)

阅读更多
知识点:音乐播放、录音、播放视频、录像、拍照

步骤一、主界面布局(代码如下)
<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" 
    android:orientation="vertical">
	<Button
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="播放音乐"
	    android:id="@+id/btn1"
	    android:onClick="myclick"
	    />
	<Button
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="录音"
	    android:id="@+id/btn2"
	    android:onClick="myclick"
	    />
	<Button
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="播放视频"
	    android:id="@+id/btn3"
	    android:onClick="myclick"
	    />
	<Button
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="录像"
	    android:id="@+id/btn4"
	    android:onClick="myclick"
	    />
	<Button
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="拍照"
	    android:id="@+id/btn5"
	    android:onClick="myclick"
	    />
</LinearLayout>


步骤二、按钮选择判断(代码如下)
package com.example.mediaplayerdemo;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;

public class MainActivity extends Activity {
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(requestCode==1){
			if(resultCode==Activity.RESULT_OK){
				//获取视频文件的ContentProvider的URI
				Uri uri=data.getData();
				//查询录制的视频
				Cursor cursor=getContentResolver().query(uri,null,null,null,null);
				if(cursor.moveToNext()){
					//获取文件的绝对路径
					String path=cursor.getString(cursor.getColumnIndex("_data"));
					Intent intent=new Intent(this,VideoActivity.class);
					intent.putExtra("path",path );
					startActivity(intent);
				}
				
			}
		}
		if(requestCode==2){
			if(resultCode==Activity.RESULT_OK){
				Intent intent=new Intent(this,CameraImageShowActivity.class);
				try{
					intent.putExtra("imagePath", outFile.getAbsolutePath());
					startActivity(intent);
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
	private String imageName="camera.jpg"; 
	private File outFile;
	public void myclick(View view){
		Intent intent;
		switch(view.getId()){
			case R.id.btn1:
				intent=new Intent(this,AudioActivity.class);
				startActivity(intent);
				break;
			case R.id.btn2:
				intent=new Intent(this,RecorderActivity.class);
				startActivity(intent);
				break;
			case R.id.btn3:
				intent=new Intent(this,VideoActivity.class);
				intent.putExtra("path",Environment.getExternalStorageDirectory()+"/饥饿游戏A.mp4" );
				startActivity(intent);
				break;
			case R.id.btn4:
				intent=new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
				startActivityForResult(intent, 1);
				break;
			case R.id.btn5:
				intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				outFile = new File(Environment.getExternalStorageDirectory(),imageName);
				Uri uri = Uri.fromFile(outFile);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
				startActivityForResult(intent,2);
				break;
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
	}
}



步骤三、音乐播放(代码如下)
package com.example.mediaplayerdemo;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewDebug.FlagToString;
import android.widget.Button;

public class AudioActivity extends Activity {
	Notification notification;
	NotificationManager manager;
	static MediaPlayer mediaPlayer;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.audio_layout);
		try {
			if(mediaPlayer!=null){
				mediaPlayer.stop();
				mediaPlayer.release();
			}
			//创建MediaPlayer对象并指定播放的音乐
			//这种形式是播放资源中的音乐(必须放在raw下)
			mediaPlayer = MediaPlayer.create(this, R.raw.power_of_love);
			//如果播放的是SD卡中的音乐
			//mediaPlayer=new MediaPlayer();
			//mediaPlayer.setDataSource()
			//在播放前必须要执行stop和prepare这2个方法
			mediaPlayer.stop();
			mediaPlayer.prepare();
			//start方法表示开始播放
			mediaPlayer.start();
			notification = new Notification(R.drawable.ic_launcher, "正在播放",
					System.currentTimeMillis());
			PendingIntent contentIntent = PendingIntent.getActivity(this, 1,
					new Intent(this, AudioActivity.class), 0);
			notification.setLatestEventInfo(this, "正在播放", "Power Of Love.mp3",
					contentIntent);
			manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
			manager.notify(1, notification);
			//OnCompletionListener方法在播放结束后触发
			mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

				@Override
				public void onCompletion(MediaPlayer mp) {
					//释放播放的资源,避免其他程序使用不到
					mediaPlayer.release();
					manager.cancel(1);
				}
			});
			Button stop_btn = (Button) findViewById(R.id.stop_btn);
			stop_btn.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					//在释放之前先停止播放
					mediaPlayer.stop();
					mediaPlayer.release();
					manager.cancel(1);
				}
			});

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


步骤四、录音(代码如下)
package com.example.mediaplayerdemo;

import java.io.File;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;

public class RecorderActivity extends Activity{
	File recordAudioFile;
	MediaRecorder mediaRecorder;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.recorder_layout);
		final Button recorder_btn=(Button)findViewById(R.id.recorder_btn);
		recorder_btn.setOnLongClickListener(new OnLongClickListener() {
			
			@Override
			public boolean onLongClick(View v) {
				try{
					recordAudioFile=File.createTempFile("record", ".mp3");
					mediaRecorder=new MediaRecorder();
					//指定来源
					mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
					//输出格式(MPGE4)
					mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
					//指定编码
					mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
					//制定录制的路径
					mediaRecorder.setOutputFile(recordAudioFile.getAbsolutePath());
					mediaRecorder.prepare();
					recorder_btn.setText("请大声说话");
					//开始录音
					mediaRecorder.start();
					
				}catch(Exception e){
					e.printStackTrace();
				}
				return false;
			}
		});
		recorder_btn.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if(event.getAction()==MotionEvent.ACTION_UP){
					final MediaPlayer mediaPlayer=new MediaPlayer();
					try{
						mediaRecorder.stop();
						mediaRecorder.release();
						mediaPlayer.setDataSource(recordAudioFile.getAbsolutePath());
						mediaPlayer.prepare();
						mediaPlayer.start();
						mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
							
							@Override
							public void onCompletion(MediaPlayer mp) {
								mediaPlayer.stop();
								mediaPlayer.release();
								recordAudioFile.delete();
								recorder_btn.setText("按下说话");
							}
						});
					}catch(Exception e){
						e.printStackTrace();
					}
				}
				return false;
			}
		});
	}

}




步骤五、播放视频(代码如下)
package com.example.mediaplayerdemo;

import android.app.Activity;
import android.media.MediaPlayer;
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.Window;
import android.view.WindowManager;
import android.widget.ImageButton;

public class VideoActivity extends Activity implements SurfaceHolder.Callback{
	private SurfaceView surfaceView;
	private SurfaceHolder surfaceHolder;
	private MediaPlayer mediaPlayer;
	private String path;
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode==event.KEYCODE_BACK){
			mediaPlayer.stop();
			finish();
			return super.onKeyDown(keyCode, event);	
		}
		return false;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.video_layout);
		surfaceView=(SurfaceView)findViewById(R.id.surfaceView);
		surfaceHolder=surfaceView.getHolder();
		surfaceHolder.addCallback(this);
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		surfaceHolder.setKeepScreenOn(true);
		path=getIntent().getStringExtra("path");
		mediaPlayer=new MediaPlayer();
		ImageButton play_btn=(ImageButton)findViewById(R.id.play_btn);
		ImageButton stop_btn=(ImageButton)findViewById(R.id.stop_btn);
		ImageButton pause_btn=(ImageButton)findViewById(R.id.pause_btn);
		ImageButton reset_btn=(ImageButton)findViewById(R.id.reset_btn);
		
	}
	private int position=0;
	
	public void onControl(View v) {
		switch(v.getId()){
			case R.id.play_btn:
				if(mediaPlayer.isPlaying()){
					return;
				}
				play();
				break;
			case R.id.pause_btn:
				position=mediaPlayer.getCurrentPosition();
				mediaPlayer.pause();
				break;
			case R.id.reset_btn:
				position=0;
				play();
				break;
			case R.id.stop_btn:
				position=0;
				mediaPlayer.stop();
				break;
		}
	}		
	
	@Override
	protected void onDestroy() {
		mediaPlayer.release();
		super.onDestroy();
	}

	private void play(){
		try{
			mediaPlayer.reset();
			mediaPlayer.setDataSource(path);
			mediaPlayer.setDisplay(surfaceHolder);
			mediaPlayer.prepare();
			Log.v("s_position", position+"");
			mediaPlayer.seekTo(position);
			mediaPlayer.start();
			position=0;
			
		}catch(Exception e){
			Log.e(getClass().getName(), e.toString());
		}
		
	}

	@Override
	protected void onPause() {
		position=mediaPlayer.getCurrentPosition();
		mediaPlayer.stop();
		super.onPause();
	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		position=savedInstanceState.getInt("position");
		super.onRestoreInstanceState(savedInstanceState);
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		outState.putInt("position", mediaPlayer.getCurrentPosition());
		super.onSaveInstanceState(outState);
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {	
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		play();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		
	}

}


步骤六、拍照(代码如下)
package com.example.mediaplayerdemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.Display;
import android.widget.ImageView;


public class CameraImageShowActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.camera_image_show_layout);
		
		
		Display display = this.getWindowManager().getDefaultDisplay();   
		int dw = display.getWidth();   
		int dh = display.getHeight(); 
		BitmapFactory.Options op = new BitmapFactory.Options();
		//必须设置为true,才能更改Options的属性
		op.inJustDecodeBounds = true; 
		Bitmap cameraBitmap=BitmapFactory.decodeFile(getIntent().getStringExtra("imagePath"),op);
		int wRatio = (int) Math.ceil(op.outWidth / (float) dw); 
		int hRatio = (int) Math.ceil(op.outHeight / (float) dh);
		if (wRatio > 1 && hRatio > 1) { 
			if (wRatio > hRatio) {   
				op.inSampleSize = wRatio;
			} else {
				op.inSampleSize = hRatio; 
			}
		}
		// 修改完毕后再设置为false
		op.inJustDecodeBounds = false; 
		cameraBitmap=BitmapFactory.decodeFile(getIntent().getStringExtra("imagePath"),op);
		
		ImageView show_full=(ImageView)findViewById(R.id.show_full);
		show_full.setImageBitmap(cameraBitmap);
	}

}


步骤七、Activity的注册+权限添加(代码如下)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mediaplayerdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.mediaplayerdemo.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".AudioActivity"/>
        <activity android:name=".RecorderActivity"/>
        <activity android:name=".VideoActivity"/>
        <activity android:name=".CameraImageShowActivity"/>
    </application>
	<uses-permission android:name="android.permission.RECORD_AUDIO"/>
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>



源码下载请点击这里(将音乐文件复制到raw文件夹):
0
0
分享到:
评论

相关推荐

    从零开始Android游戏编程(第二版)PDF版

    本书《从零开始Android游戏编程(第二版)》是为那些想要踏入这个领域的初学者精心编写的。它将引导你逐步了解并掌握Android游戏开发的基本技术和流程,助你实现自己的游戏梦想。 首先,Android游戏编程的基础是...

    android从零开始

    《Android从零开始》这份文档全面且深入地介绍了Android开发的基础知识,对于初学者来说,是一份极佳的学习资源。Android作为全球最流行的移动操作系统,它的应用开发领域广阔,涉及了从用户界面设计到系统级别的...

    《从零开始学Android编程》 PDF

    《从零开始学Android编程》这本书是一本针对初学者精心编写的指南,旨在帮助读者从基础开始逐步掌握Android应用开发的全过程。通过17个章节的深入讲解,它覆盖了Android系统的基本概念、编程环境搭建、应用程序设计...

    从零开始Android游戏编程

    在《从零开始Android游戏编程》(第二版)这一资源中,作者为我们提供了一条系统学习Android游戏开发的道路。本书涵盖了从基础知识到高级技术的全方位教程,旨在帮助初学者逐步建立起扎实的游戏编程技能。以下是对十二...

    android《从零开始PPT》

    这个"android《从零开始PPT》"是为初学者设计的学习资源,旨在帮助他们从基础开始掌握Android开发的知识。 PPT通常包含了丰富的图文信息,能够系统地介绍Android开发的各个方面。首先,这份PPT可能会涵盖Android的...

    从零开始Android游戏编程(第二版)

    《从零开始Android游戏编程(第二版)》是一本针对初学者的专业教程,旨在帮助读者逐步掌握Android平台上的游戏开发技术。这本书详细介绍了如何利用Java语言和Android Studio开发出具有吸引力的游戏应用。以下是对该...

    黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)

    《黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)》是一部针对初学者的全面Android开发教程,旨在帮助学员系统地掌握Android应用开发的基础知识和实战技巧。通过本教程的学习,你可以从理论出发,...

    android 游戏从零开始 源码

    这个压缩包"《Android游戏编程之从零开始》-Himi-李华明-书籍源码"提供了从基础到进阶的游戏开发源码,适合初学者和有一定经验的开发者进行学习和实践。以下将详细阐述这个资源中涉及的主要知识点。 1. **Android...

    从零开始学Android编程源代码-2

    "从零开始学Android编程源代码-2" 提供了11至17章的学习资源,旨在帮助初学者逐步掌握Android应用开发的核心技术。以下是这些章节中涵盖的关键知识点: 1. **第11章:用户界面设计** - 这一章主要讲解如何使用...

    Android多媒体选择器支持图片和视频.zip

    在Android开发中,多媒体选择器是一个非常重要的组件,它允许用户在应用中方便地选取图片和视频。...通过PrimFilePicker,开发者可以避免从零开始编写选择器代码,从而将更多精力放在应用的核心功能上。

    android开发从入门到精通光盘源代码

    1. **环境搭建**:开始Android开发前,需要安装Android Studio,它包含了Android SDK、模拟器以及各种工具,能提供代码编辑、调试和构建等功能。同时,设置Android SDK的各个版本,以便支持不同API级别的设备。 2. ...

    Android-boxing基于MVP模式的Android多媒体选择器

    Android-boxing库通过封装这些复杂操作,让开发者可以快速集成多媒体选择功能,而无需从零开始编写大量重复的代码。这一库尤其适用于需要在应用中实现相册功能的开发者,比如社交应用、图片编辑应用等。 【Android ...

    从零开始OPhone游戏编程(源码)

    从标题和描述中我们可以看出,这个压缩包包含了一些基础的游戏开发源码,比如"Mine"和"Tank",以及可能的相关文档"android doc",这些都是学习OPhone游戏开发的重要资源。 首先,我们要理解OPhone是什么。OPhone是...

    零基础学Android

    "零基础学Android"意味着从最基础的概念开始,逐步深入到高级技术,全面掌握Android应用开发。 1. **Java核心**: Java是Android应用开发的基础语言,因此首先需要了解Java语法、面向对象编程、异常处理、集合框架、...

    Android从入门到精通(PPT)

    《Android从入门到精通...通过这份详尽的PPT教程,读者可以从零开始,逐步掌握Android开发的各个方面,直至达到精通的程度。无论你是刚接触Android的新手,还是希望提升技能的开发者,这套资料都将为你提供宝贵的参考。

    从零开始OPhone游戏编程

    【从零开始OPhone游戏编程】是一本针对初学者的指南,主要讲解如何在Android平台上进行游戏开发。这本书特别关注OPhone,一个基于Android系统的中国移动定制版操作系统,尽管OPhone在国内市场的份额已不如从前,但其...

    《Android Studio开发实战:从零基础到App上线 》读书笔记模板x.pptx

    " Android Studio开发实战:从零基础到App上线读书笔记模板 " 本书是一部Android开发的实战教程,由浅入深、由基础到高级,带领读者一步一步走进App开发的神奇世界。全书共分为16章,前8章是基础部分,主要讲解...

    Android开发从入门到精通(随书光盘)【源码】第16章

    "Android开发从入门到精通(随书光盘)【源码】第16章"显然是一份专为Android开发者设计的学习资源,它可能包含了深入第16章主题的实践代码示例。这份资料能够帮助开发者深化对Android应用开发的理解,尤其是通过...

Global site tag (gtag.js) - Google Analytics