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

来源:互联网 发布:天刀捏脸数据 女 冰儿 编辑:程序博客网 时间:2024/06/06 16:11



多媒体

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>异常事件_唤醒锁_Notification1>异常事件 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


0 0
原创粉丝点击