Android開發_多媒體的簡單應用

SoundPool類

SoundPool類適合用來播放一些短暫的反應速度要求高的聲音。SoundPool載入音樂文件使用了獨立的線程,不會阻塞UI主線程的操作。SoundPool類支持同時播放多個音效。 應用實例如下:

public class MainActivity extends Activity {
	private SoundPool sp;
	private int soundID;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * maxStreams : 音源的個數 streamType : 音源的類型 srcQuality : 音源的質量
		 */
		sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

		// 實例化AudioManager對象,控制聲音
		AudioManager am = (AudioManager) this
				.getSystemService(MainActivity.AUDIO_SERVICE);
		// 最大音量
		float audioMaxVolumn = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		// 當前音量
		float audioCurrentVolumn = am
				.getStreamVolume(AudioManager.STREAM_MUSIC);

		float volumnRatio = audioCurrentVolumn / audioMaxVolumn;

		// 裝載音源,返回相應的id
		soundID = sp.load(this, R.raw.song, 1);

		// 播放聲音,priority:優先級,0最低,loop:循環次數,0是不循環,-1是永遠循環,rate:回放速度,0.5-2.0之間,1爲正常速度
		// sp.play(soundID, leftVolume, rightVolume, priority,loop, rate);
		sp.play(soundID, volumnRatio, volumnRatio, 1, 0, 1);
	}
}

MediaPlayer類

使用MediaPlayer類來播放音頻文件

public class Main extends Activity  implements OnClickListener,OnCompletionListener
{
	private MediaPlayer mediaPlayer;
	private Button btnPause;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		Button btnStart1 = (Button)findViewById(R.id.btnStart1);
		Button btnStart2 = (Button)findViewById(R.id.btnStart2);
		
		Button btnStop = (Button)findViewById(R.id.btnStop);
		
		btnPause = (Button)findViewById(R.id.btnPause);
		
		btnStart1.setOnClickListener(this);
		btnStart2.setOnClickListener(this);
		btnStop.setOnClickListener(this);
		btnPause.setOnClickListener(this);
	}
	
	// 回掉方法,監聽音頻文件播放完畢
	public void onCompletion(MediaPlayer mp)
	{
		mp.release();
		setTitle("釋放資源");
	}
	public void onClick(View view)
	{
		try
		{
			switch (view.getId()) {
			case R.id.btnStart1:  // 播放工程目錄下的文件
				mediaPlayer = MediaPlayer.create(this, R.raw.music);
				mediaPlayer.setOnCompletionListener(this);
				// 不需要調用prepare()方法,因爲在create()中已經調用過了
				mediaPlayer.start();	
				break;
			case R.id.btnStart2://  播放SD卡上的音頻文件(/sdcard/music.mp3)
				mediaPlayer = new MediaPlayer();
				mediaPlayer.setDataSource("/sdcard/music.mp3");
				
				mediaPlayer.prepare();
				mediaPlayer.start();
				break;
				
			case R.id.btnStop:
				if(mediaPlayer != null)
				{
					if(mediaPlayer.isPlaying())
						mediaPlayer.stop();
				}
				break;	
			case R.id.btnPause:
				if(mediaPlayer != null)
				{
					if("播放".equals(btnPause.getText().toString()))
					{
						mediaPlayer.start();
						btnPause.setText("暫停");
						
					}
					else if("暫停".equals(btnPause.getText().toString()))
					{
						mediaPlayer.pause();
						btnPause.setText("播放");
					}
				}
				break;
			default:
				break;
			}
		}
		catch (Exception e) {
			// TODO: handle exception
		}
	}
}

使用MediaPlayer類來播放視頻文件

public class MainActivity extends Activity {
	private SurfaceView sv;
	private SurfaceHolder sh;
	
	private Callback callback = new Callback() {
		MediaPlayer mp = null;

		@Override
		public void surfaceDestroyed(SurfaceHolder arg0) {
			if (mp != null) {
				mp.stop();// 停止播放
				mp.release();// 釋放資源
				mp = null;
			}
		}

		@Override
		public void surfaceCreated(SurfaceHolder arg0) {
			mp = MediaPlayer.create(this, R.raw.move);
			try {
				mp.prepare();// 準備播放

			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			mp.setDisplay(sh);
			mp.start();// 播放視頻
		}

		@Override
		public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
				int arg3) {

		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		sv = new SurfaceView(this);
		sh = sv.getHolder();
		sh.addCallback(callback);
		setContentView(sv);
	}
}

使用VideoView類來播放視頻文件

<span style="font-size:14px;">public class MainActivity extends Activity {
	private VideoView vv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		vv = new VideoView(this);
		setContentView(vv);

		vv.setVideoPath("/mnt/sdcard/movie.mp4");
		vv.setMediaController(new MediaController(this));
	}
}</span>

更詳細MediaPlayer類介紹:http://www.eoeandroid.com/thread-176453-1-1.html(引用)


MediaRecorder錄音

需要獲取的權限:<uses-permission android:name="android.permission.RECORD_AUDIO" />

<span style="font-size:14px;">public class MainActivity extends Activity {

	private MediaRecorder mr;
	private Button btnStart;// 開始錄音按鈕
	private Button btnStop;// 停止錄音按鈕

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

		btnStart = (Button) findViewById(R.id.btnStart);
		btnStop = (Button) findViewById(R.id.btnStop);

		btnStart.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				startRecord();// 開始錄音
			}
		});

		btnStop.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				stopRecord();// 停止錄音
			}
		});
	}

	// 停止錄音方法
	protected void stopRecord() {
		if (mr != null) {
			mr.stop();
			mr.release();
			mr = null;
		}
	}

	// 開始錄音方法
	protected void startRecord() {
		if (mr == null) {
			// 在sdcard卡下創建相應的文件目錄
			File dir = new File(Environment.getExternalStorageDirectory(),
					"sounds");

			if (!dir.exists()) {
				dir.mkdir();
			}

			// 創建錄音文件
			File file = new File(dir, System.currentTimeMillis() + "amr");

			if (!file.exists()) {
				try {
					file.createNewFile();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			mr = new MediaRecorder();// 創建對象
			// 設置錄音源
			mr.setAudioSource(MediaRecorder.AudioSource.MIC);
			// 設置輸出格式
			mr.setOutputFormat(MediaRecorder.OutputFormat.AMR_WB);
			// 設置音源編碼
			mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
			// 設置輸出路徑
			mr.setOutputFile(file.getAbsolutePath());

			try {
				mr.prepare();// 準備錄音
				mr.start();// 開始錄音
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}</span>


通過調用系統的攝像頭來進行拍照

public class Main extends Activity implements OnClickListener
{
	private ImageView imageView;
	
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		Button btnTakePicture = (Button)findViewById(R.id.btnTakePicture);
		btnTakePicture.setOnClickListener(this);
		
		imageView = (ImageView)findViewById(R.id.imageview);
		
	}
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		if(requestCode == 1)
		{
			if(resultCode == Activity.RESULT_OK)
			{
				Bitmap cameraBitmap = (Bitmap)data.getExtras().get("data");
				imageView.setImageBitmap(cameraBitmap);	
			}
		}
	}
	
    public void onClick(View view)
    {
    	Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    	startActivityForResult(intent, 1);
    }
}

通過調用系統的攝像頭來進行錄像

public class Main extends Activity implements OnClickListener {
	public VideoView videoView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button btnTakePicture = (Button) findViewById(R.id.btnTakePicture);
		btnTakePicture.setOnClickListener(this);

		videoView = (VideoView) findViewById(R.id.videoview);

	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1)
        {
        	if(resultCode == Activity.RESULT_OK)
        	{
        		Uri uri = data.getData();
        		Cursor cursor = this.getContentResolver().query(uri,null,null,null,null);
        		
        		if(cursor.moveToFirst())
        		{
        			String videoPath =  cursor.getString(cursor.getColumnIndex("_data"));
        			videoView.setVideoURI(Uri.parse(videoPath));
        			videoView.setMediaController(new MediaController(this));
        			videoView.start();
        		}
        	}
        }
	}

	public void onClick(View view) {
		Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
		startActivityForResult(intent, 1);
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章