SoundPool、 VedioView、 MediaRecorder、 SurfaceView、 Camera、

SoundPool

提示音,適合短促且對反應速度比較高的情況(遊戲音效或按鍵聲等),一般文件較小,只有幾十K,使用MediaPlayer會浪費內存,所以用SoundPool。

priority —— 流的優先級,值越大優先級高,影響當同時播放數量超出了最大支持數時SoundPool對該流的處理;
loop —— 循環播放的次數,0爲值播放一次,-1爲無限循環,其他值爲播放loop+1次(例如,3爲一共播放4次).
rate —— 播放的速率,範圍0.5-2.0(0.5爲一半速率,1.0爲正常速率,2.0爲兩倍速率)

1.管理多個音頻資源,通過load()函數,成功則返回非0的soundID;
2.同時播放多個音頻,通過play()函數,成功則返回非0的streamID;
3.pause()、resume()和stop()等操作是針對streamID(播放流)的;
4.當設置爲無限循環時,需要手動調用stop()來終止播放;
5.播放流的優先級(play()中的priority參數),只在同時播放數超過設定的最大數時起作用;
6.程序中不用考慮(play觸發的)播放流的生命週期,無效的soundID/streamID不會導致程序錯誤。

package com.example.administrator.mymusicplayer;
import android.app.Activity;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by Administrator on 2015/9/15.
 */
public class SoundPoolActivity extends Activity {
    private Button mButtonSoundPool;
    private static int voiceID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_soundpool);
        mButtonSoundPool = (Button) findViewById(R.id.button_soundpool);
        mButtonSoundPool.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                playSound();
            }
        });
        voiceID = initSoundPool();
    }

    private SoundPool pool = null;

    public void playSound() {
        pool.play(voiceID, 1, 1, 0, 0, 1);
    }

    private int initSoundPool() {
        if (Build.VERSION.SDK_INT >= 21) {
            SoundPool.Builder builder = new SoundPool.Builder();
            builder.setMaxStreams(2);
            AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
            attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
            builder.setAudioAttributes(attrBuilder.build());
            pool = builder.build();
        } else {
            pool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
        }
        return pool.load(getApplicationContext(), R.raw.outgoing, 1);
    }
}

MediaRecorder

錄製音視頻
錄製結束時,調用stop方法,並且調用reset、release方法釋放掉資源。
注意加上權限:

package com.example.administrator.mymusicplayer;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import java.io.IOException;


public class MainActivity extends Activity implements View.OnClickListener {
    private Button mButtonStart;
    private Button mButtonStop;
    private MediaRecorder mediaRecorder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButtonStart = (Button) findViewById(R.id.button_start_recorder);
        mButtonStop = (Button) findViewById(R.id.button_stop_recorder);
        mButtonStart.setOnClickListener(this);
        mButtonStop.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button_start_recorder:
                mediaRecorder = new MediaRecorder();
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/MyRecorder.mp3");
                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            case R.id.button_stop_recorder:
                mediaRecorder.stop();
                mediaRecorder.reset();
                mediaRecorder.release();
                break;
        }

    }
}

VedioView

視頻播放,僅限於mp4和3gp格式。
注意權限:

package com.example.administrator.mymusicplayer;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;

/**
 * Created by Administrator on 2015/9/15.
 */
public class VideoViewActivity extends Activity {
    private Button mButtonStart;
    private VideoView videoView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vedioview);
        mButtonStart = (Button) findViewById(R.id.button_start);
        videoView = (VideoView) findViewById(R.id.videoview);
        mButtonStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                videoView.setVideoPath(Environment.getExternalStorageDirectory()+"/VID_20150502_090524.3gp");
                videoView.setMediaController(new MediaController(VideoViewActivity.this));
                videoView.start();
            }
        });
    }
}

SurfaceView

自帶繪製線程,SurfaceView是視圖(View)的繼承類,這個視圖裏內嵌了一個專門用於繪製的Surface。
注意權限:

package com.example.administrator.mymediasurfaceview;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import java.io.IOException;


public class MainActivity extends Activity {
    private Button mButtonStart;
    private SurfaceView mSurfaceView;
    private MediaPlayer player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButtonStart = (Button) findViewById(R.id.button_start);
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        mButtonStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (player == null){
                    player = new MediaPlayer();
                }
                player.reset();
                try {
                    player.setDataSource(Environment.getExternalStorageDirectory()+"/VID_20150502_090524.3gp");
                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    player.setDisplay(mSurfaceView.getHolder());
                    player.prepare();
                    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
                        @Override
                        public void onPrepared(MediaPlayer mediaPlayer) {
                            mediaPlayer.start();
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Camera

這裏給一個例子,調用系統的照相機拍攝一張照片並顯示。

package com.example.administrator.mymediasurfaceview;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.File;
import java.io.IOException;

/**
 * Created by Administrator on 2015/9/15.
 */
public class CameraActivity extends Activity {
    private Button mButtonStartCamera;
    private ImageView mImageView;
    private File file;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        mButtonStartCamera = (Button) findViewById(R.id.button_start_camera);
        mImageView = (ImageView) findViewById(R.id.imageview);

        mButtonStartCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//隱式啓動系統相機
                file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));//告訴系統相機將照片保存的位置
                startActivityForResult(intent,0x23);//開始啓動
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==0x23){
            if (resultCode==RESULT_OK){
                mImageView.setImageURI(Uri.fromFile(file));//得到圖片
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章