Android12_播放器_surfaceVIew_照相机_传感器
编程的时间与空间的概念,两者不可兼得(技术固定),时间换空间,空间换时间
sufaceView占用比较大的空间但是效率高
1,音乐播放器 MediaPlayer
①同步的
大致流程按下图走即可,播放最好写在服务里,因为要在后台播放
1.1 new出来的mediaplayer 默认处于Idie(空闲),reset()也可以让其处于初始状态
1.2 setDataSource()设置好文件之后就处于Initialized()初始化状态
1.3 可以通过setOnErrorListener方法查看播放过程中失败原因,对应的int what是为什么失败.
1.4 prepare();处于准备状态.
1.5 start()开始播放,进入Starer状态
1.6 setOnCompletionListener()播放状态监听
②不同步的音乐播放
prepareAsync()异步准备,播放网络的音乐文件,
记得添加权限
Prepare()同步的准备,运行在主线程,网速够快的前提下没问题,但是也有可能导致应用程序无响应
prepareAsync()异步的准备,会自己开启子线程去播放,但是这里可能会有没有准备好就开启播放的可能,这里要设置一个setOnprepareListener()的监听,当准备好了之后再去调用start()方法去播放
可以在准备监听的事件中去设置一个消息框:正在缓冲
2,soundpool
mediaPlayer底层实现比较复制,步骤繁琐,当一个音频资源在单位时间内大量的重复播放,mediaPlayer就不方便了.
Soundpool:单位时间内大量播放音频,应用场景,游戏按扳机开枪
在res目录下,创建一个文件夹raw放置音频文件,会自动生成R文件的id
步骤:①创建声音池
SoundPool soundpool = new SoundPool(音频的数量,推荐使用AUdioManager.STREAM_MUSIC(还有其他类型,MUSIC时间长短不容),声音的质量);
②把音频资源加载到内存 ,返回一个声音在内存中的id
Int Soundid = Soundpool.load(上下文,资源id,优先级); //放在点击事件里就无法载入
③播放声音
Soundpool.play(声音id,左声道1.0,右声道1.0,优先级(0最低),循环次数0不循环,-1永远循环,rate音频播放的速率0.5-2.0)
音频播放的速率应用场景:汤姆猫的声音app
左右声道的音量大小,最大为1.0
3,视频播放器
①一般都是横屏播放,在Activity标签中定义screenOrientation=”LandScope”//设置为横屏
样式标签中定义:item,name=android:windowFullScreen true
(在Theme.NoTitleBar.Fullscreen的样式中有)
②新的控件VideoView vv
在activity中找到它(3GP,MP4的都可以播放)
vv.setVideoPath()//设置播放路径
//需要进度条,快进快退
MediaController mc = new xx(this);//创建控制器
mc.setAnchorView(vv)//设置控制器控制的videoView
vv.setMediaContro aller(mc)// 设置控制器
Vv.start();开始播放
真实的手机支持的格式更多
4,SurfaceView 控件sv
一般安卓里比较复杂的控件由mvc组成(ListView)
4.1 SurfaceView单位时间内完成界面的大量多次更新
因为它有双缓冲机制
线程A ----更新ui -----后台计算 ---更新ui
线程B ----后台计算----更新ui ---后台计算
SurfaceView可以在子线程中更新ui(视频播放底层就是用的它可以大量跟新)
子线程更新ui的使用步骤:
①创建一个子线程
SurfaceHolder holder = sv.getHolder();//界面里面的内容显示控制器
Canvas = holder.lockCanvas();//返回一个画板,并且锁定了画布
Paint = new paint(),paint.setColor();
canvas.drawCircle(x,y,半径,画笔);
②直接运行会报异常,lockCanvas//锁定了画布
holder.unlockCanvasAndPost(canvas)//解锁画布并更新ui
锁定画布之后立刻更新ui,睡眠的代码放到最后
4.3 细节问题:
①如果把带有SurfaceView的子线程放到onCreate()中使用lockCanvas获取的画布有可能为null,但是如果之前有睡眠的代码,就可以正常进行.
因为sv占用的内存和cpu开销很大,当界面完全可见的时候才会创建完毕,如果界面最小化holder就会被销毁掉,所以在onCreate()中去更新ui,sv的holder可能还没有创建,所以会报空指针异常
解决方法:sv.getHolder().addCallBack(接口)//注册一个SurfaceView控制器的回调
,销毁,大小发生了变化
②如果SurfaceView被销毁了,执行的代码也应该全部销毁掉(终止一个线程可以通过return结束它)
4.4 采用SurfaceView进行播放视频
①创建控制器的回调方法sv.getHolder().addCallBack();
②创建一个mediaplayer去设置路径,//它在后台也会播放
③在回调方法中,如果sv被创建了
就准备播放,开始播放,可以设置进度seekto(位置);
④在回调的方法中,如果sv被销毁了,就准备暂停视频
Int weizhi = mediaplayer.getCurrentPosition();//把位置信息保存下来,可以通过sp保存.
Mediaplayer.stop()//停止的方法
Mediaplayer.release();//释放资源
一般还是用mediaplayer因为它比较方便,要自定义就SurfaceView控件
5,照相机拍照
查看离线文档>>标题栏Develop>>Media and Camera>>Camera 使用已经存在的照相机应用
里面有一段示例代码,可以用来使用照相机应用
// create Intent to take a picture and return control to the calling application
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
filename = new File(); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); //Uri.fromfile(filename)
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
使用onActivityResult方法获取返回结果
要记得判断照片是否存在,且有内容
不从intent里面直接获取图片是因为这个图片被严重的压缩,很模糊,所以通过文件的方式进行传递
6.手机录制视频
大致流程跟拍照一致,不过不能在ImageView中显示,而要在VideoView 中显示
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
需要配权限.
7,传感器相关
安卓默认支持很多传感器,利用这些传感器可以开发出很多有意思的应用,摇一摇用的是方向传感器.加速度传感器,丢手机加速度的软件
但是实际上手机里面的传感器是有限的,看手机价位来,查询手机上传感器的数量,谷歌已经封装好了一套接口用来查看.
SensorManager sm = getSystemService(SENSOR_SERVICE);
sm.getSensorList(Sensor.TYPE_ALL)//拿到所有的传感器,返回一个list集合
对于每一个元素getName()即可获取名称.
//不过模拟器虽然有传感器,但是不能用(你想摇晃你的电脑吗?)
实例:光线传感器.应用场景打电话的时候,屏幕变黑了.
Sensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT)//获取一个传感器,根据参数获取
sm.registerListener(传感器监听,sensor,rate);
rate采样频率,敏感度.游戏开发采样速度一分钟几百次,越快越费电,
SENSOR_DELAY_NORMAL //采用默认的采样速度
传感器监听里面有两个方法
一个onSensorChanged(event):当传感器数据发生变化的时候调用,
Event的帮助文档里有关于各种传感器的说明
Float light = Event.value[0]//光传感器的强度
可以对光线强度做判断,然后判断是否开启夜间模式,屏幕降低亮度等
一个是onAccurayChanged(sensor,accuracy)//精度发生变化:如地磁传感器,位置发生改变
额外:应用程序使用完了传感器要记得关闭,因为它会在后台运行,并且很耗电.
sm.unregisterListener(监听器);
7.2 指南针应用:使用传感器:方向传感器
①获取传感器服务管理,获取传感器
②查看帮助文档value[0]代表:地磁北极和手机Y轴的夹角,0=北,90=东,180=南,270=西.
Z轴是水平垂直,X,Y轴是手机屏幕中心为原点的平面X,Y轴
③然后可以对角度进行判断,可以判断出东南西北,通过一张指南针图片,指针的旋转角度来判断对应的角度.