您的位置:首页 > 其它

11-23 多媒体 MediaPlayer、Camera、MediaRecorder Vitamio 笔记

2016-08-01 20:24 204 查看

多媒体

android提供了多媒体框架可以实现音频视频的控制操作,

主要的API类库有:MediaPlayer、Camera、MediaRecorder

1、MediaPlayer的使用


<1>MediaPlayer播放
(1)播放程序本地资源文件
public void playResFileClick(View v){
mediaPlayer = MediaPlayer.create(this,R.raw.a1);
mediaPlayer.start();
}
(2)播放SDCard文件
public void playSDcardFileClick(View v){
mediaPlayer = new MediaPlayer();
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)+"/后会无期.mp3";
try {
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
}

(3)播放网络文件
public void playNetFileClick(View v){
mediaPlayer = new MediaPlayer();
String path ="http://cc.stream.qqmusic.qq.com/C100001Orf0q32GTFF.m4a?fromtag=52";
try {
mediaPlayer.setDataSource(path);
mediaPlayer.prepareAsync();//异步缓冲文件
//异步缓冲监听事件
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}

<2>MediaPlayer状态分析与方法
参考API文档MediaPlayer的状态图

<3>使用服务控制MediaPlayer

<4>异常事件_唤醒锁_Notification
1>异常事件 implements MediaPlayer.OnErrorListener,在MediaPlayer出现异常时,我们通常
可以重置MediaPlayer对象。在onErrorListener的回调方法中调用mediaPlayer.reset()方法。

2>唤醒锁(了解)
用于保持在媒体播放时,防止屏幕休眠,需要添加权限:
<uses-permission android:name="android.permission.WAKE_LOCK"/>
但需要注意的时,你总是应该在必要的时间解除唤醒锁,否则会消耗电量

3>Notification
播放音乐时,我们可以使用通知的方式,在通知栏添加操作功能,以方便用户控制播放或返回到
播放界面。
//发一个通知
private void notification(){

Notification.Builder builder = new Notification.Builder(this);
builder.setTicker("我的播放器");
builder.setSmallIcon(R.mipmap.music_app_80x80);
builder.setContentTitle("正在播放:后会无期");
builder.setContentText("邓紫棋");
Intent intent = new Intent(this,Main2Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
builder.setContentIntent(pi);
builder.setOngoing(true);
Notification n = builder.build();
startForeground(1,n);
nm.notify(MUSIC_NID,n);
}

<5>处理音频焦点(了解)
参考PPT

<6>处理噪音
当用户用耳机听音乐时,突然耳机异常中断,导致声音从扬声器中发出,此时可能不是用户想要的
我们把这样的声音理解为噪音,如何处理噪音,我们可以通过系统发出的中断广播来处理:
public class MusicIntentReceiver extends BroadcastReceiver {
public MusicIntentReceiver() {
}

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("android.media.AUDIO_BECOMING_NOISY".equals(action)) {
Intent service = new Intent(MusicService.ACTION_PAUSE);
context.startService(service);
}
}
}
并在清单文件中注册广播接收器,添加action:
android.media.AUDIO_BECOMING_NOISY

<7>使用CP获取本地媒体
//初始化音乐数据(从ContentProvider获取本地音乐数据)
private void initMusicData() {
ContentResolver cr = getContentResolver();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Log.i("MediaUri",uri.toString());
Cursor c = cr.query(uri,null,
MediaStore.Audio.Media.IS_MUSIC+"=? and "+MediaStore.Audio.Media.DURATION+">=?" ,
new String[]{"1","180000"},null);
if(c==null)return;
else{
Music m = null;
while(c.moveToNext()){
m = new Music(
c.getLong(c.getColumnIndex(MediaStore.Audio.Media._ID)),
c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)),
c.getString(c.getColumnIndex(MediaStore.Audio.Media.TITLE)),
c.getString(c.getColumnIndex(MediaStore.Audio.Media.ARTIST)));
musics.add(m);
}
c.close();
if(musics.size()>0){
musicAdapter.setMusicList(musics);
musicAdapter.notifyDataSetChanged();
}
}
}


2、Camera

使用摄像头,需要添加权限:
<uses-permission android:name="android.permission.CAMERA" />
SDCard读写:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

public class CameraActivity extends AppCompatActivity {

//通过两个类型分别生成保存图片和视频的文件位置
private static final int TYPE_CAPTURE_IMAGE = 0x1;
private static final int TYPE_CAPTURE_VIDEO = 0x2;

//请求编码(用于startActivityForResult方法)
private static final int REQUEST_CODE_IMAGE = 0x3;
private static final int REQUEST_CODE_VIDEO = 0x4;
private ImageView imageView_image_capture;
private TextView textView_path;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
imageView_image_capture = (ImageView) findViewById(R.id.imageView3_image_capture);
textView_path = (TextView) findViewById(R.id.textView_video_path);
}

private File file;
public void imageCaptureClick(View view){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
file = getCaptureFile(TYPE_CAPTURE_IMAGE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent,REQUEST_CODE_IMAGE);
}
public void videoCaptureClick(View view){
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
file = getCaptureFile(TYPE_CAPTURE_VIDEO);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent,REQUEST_CODE_VIDEO);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode){
case RESULT_OK:
if(requestCode==REQUEST_CODE_IMAGE){
if(data==null){
Log.i("image",file.getAbsolutePath());
Log.i("image",file.length()+"");
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(),options);

imageView_image_capture.setImageBitmap(bitmap);
}else{
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
imageView_image_capture.setImageBitmap(bitmap);
}
}else if(requestCode==REQUEST_CODE_VIDEO){
textView_path.setText(file.toString());
}
break;
}
}

private File getCaptureFile(int type){
String path = null;
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String fileName = df.format(new Date());
switch (type){
case TYPE_CAPTURE_IMAGE:
path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES)+"/"+fileName+".jpg";
break;
case TYPE_CAPTURE_VIDEO:
path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MOVIES)+"/"+fileName+".mp4";
break;
}
return new File(path);
}
}



3、音频录制(了解)

private void init(){
mr.reset();
mr.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音源
mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//文件格式
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//文件编码
String path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MUSIC)+"/"+ System.currentTimeMillis()+".mp3";
mr.setOutputFile(path);
try {
mr.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button7_start:
init();
mr.start();
button_stop.setEnabled(true);
button_start.setEnabled(false);
break;
case R.id.button8_stop:
mr.stop();
button_stop.setEnabled(false);
button_start.setEnabled(true);
break;
}
}

@Override
protected void onDestroy() {
super.onDestroy();
if(mr!=null)mr.release();
}


4、Vitamio框架

一个功能强大的多媒体框架,可以支持常用的媒体文件格式,和流媒体。
在项目中集成:
<1>使用AS的添加第三方依赖包:
compile 'me.neavo:vitamio:4.2.2'

<2>在项目的libs目录(注意一定要是libs目录)下添加so库,可以从vitamio源码中的
dist\arm_x86_mips\libs 下把文件复制中libs中

<3>打开工程的清单文件,添加权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<4>配置一个用于初始化的Activity(由vitamio提供)
<!-- Don't forgot InitActivity -->
<activity
android:name="io.vov.vitamio.activity.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" />
<5>在程序启动时,添加检查是否加载lib库的代码:
通过可以在Activity的基类中的onCreate方法添加以下代码

if (!LibsChecker.checkVitamioLibs(this))
return;

API的使用可以参: https://www.vitamio.org 官网
示例可以参考源码中自带的示例:
vitamio-sample

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: