学习内容
- Google Android Training
http://developer.android.com/training/index.html - Github托管
https://github.com/kesenhoo/android-training-course-in-chinese - 中文阅读地址
http://hukai.me/android-training-course-in-chinese/index.html
以下是仅对我个人有意义的笔记
3. Android多媒体
3.1. 管理音频播放
3.1.1. 控制音量与音频播放
用硬件来控制音量(onCreate)
setVolumeControlStream(AudioManager.STREAM_MUSIC);
manifest上注册一个广播就可以接收硬件(耳机或者物理按钮)对音频的播放,在activity监听intent事件,对不同事件做不同处理。
- 存在多个程序在监听与媒体按钮相关的事件,所以需要在代码中控制应用接收相关事件的时机。使用AudioManager为应用注册监听与取消监听媒体按钮事件,当Receiver被注册上时,它将是唯一一个能够响应媒体按钮广播的Receiver。
3.1.2. 管理音频焦点
- 获取音频焦点,requestAudioFocus(),AUDIOFOCUS_REQUEST_GRANTED表示成功。另外必须指定正在使用的音频流+所请求的音频焦点是永久(比如播放音乐)/暂时(比如播放导航指示)。
- 获取永久焦点播放完成之后要调用abandonAudioFocus()方法。这样相当于告知系统我们不再需要获取焦点并且注销所关联的AudioManager.OnAudioFocusChangeListener监听器。
- Ducking模式,只在信息来的时候凸显一下,之后就对现在的播放毫无影响
- 当接受到描述焦点改变的事件时会触发onAudioFocusChange()回调方法:永久失去,短暂失去,允许Ducking的短暂失去。
3.1.3. 兼容音频输出设备
- AudioManager来检测使用了什么播放硬件
- 系统会在切换硬件播放器的情况下,广播带有ACTION_AUDIO_BECOMING_NOISY的Intent。无论何时播放音频,我们都应该注册一个BroadcastReceiver来监听这个Intent。
3.2. 拍照
3.2.1. 简单的拍照
- 设置获取相机权限(先用hasSystemFeature(PackageManager.FEATURE_CAMERA)查看是否有相机)
- 拍照:发送一个Intent来捕获照片,用startActivityForResult()来吊起这个服务,在这之前需要resolveActivity()来检查是否有Activity可以处理这个intent。
- 在onActivityResult处理照片:存放到相册、解码一副缩放图(现在第三方的技术已经很成熟了,源码了解一下原理就可以了)
3.2.2. 简单的录像
- 跟用相机拍摄照片是一样的,用的API不一样而已
3.2.3. 控制相机硬件
- 在onCreate里面另起一个线程,在这个线程里对Camera进行操作(避免阻碍UI线程)/在onResume里面去打开Camera
- Camera被硬件调用的时候,方法会抛出Exception,用try捕获然后操作。
- 预览Preview,就是打开相机的时候不是漆黑一片,而是有图像的(我还以为这是相机本身就有的……原来是设定过的?)一个Camera实例与它相关的Preview必须按照特定的顺序来创建,通常来说Camera对象优先被创建。
- 修改相机设置 用Camera.Parameters
- 设置预览方向 setCameraDisplayOrientation()
- 拍摄照片Camera.takePicture():Camera.PictureCallback与Camera.ShutterCallback对象并将他们传递到Camera.takePicture()中。
- 在预览Surface组件被销毁之后要停止预览并释放相机
3.3. 打印
3.3.1. 打印照片
PrintHelper类选取SCALE_MODE_FIT/SCALE_MODE_FILL模式
private void doPhotoPrint() { PrintHelper photoPrinter = new PrintHelper(getActivity()); photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.droids); photoPrinter.printBitmap("droids.jpg - test print", bitmap); }
3.3.2. 打印HTML文档
- webview(可写xml/直接在activity里纯代码实现一个webview)显示HTML文档,然后实现打印
- Note: 请确保在WebViewClient)中的onPageFinished()方法内调用创建打印任务的方法。如果没有等到页面加载完毕就进行打印,打印的输出可能会不完整或空白,甚至可能会失败。
- Note:在上面的样例代码中,保留了一个WebView对象实例的引用,这样能够确保它不会在打印任务创建之前就被垃圾回收器所回收。在编写代码时请务必这样做,否则打印的进程可能会无法继续执行。
- HTML的文档可以是String形式/本地文件/网络文件
- 创建打印任务:PrintManager+ PrintDocumentAdapter
3.3.3. 打印自定义文档
命名一个打印任务+设置一个PrintDocumentAdapter类的实例,它负责处理打印生命周期的每一步。
private void doPrint() { // Get a PrintManager instance PrintManager printManager = (PrintManager) getActivity() .getSystemService(Context.PRINT_SERVICE); // Set job name, which will be displayed in the print queue String jobName = getActivity().getString(R.string.app_name) + " Document"; // Start a print job, passing in a PrintDocumentAdapter implementation // to handle the generation of a print document printManager.print(jobName, new MyPrintDocumentAdapter(getActivity()), null); // }
创建打印适配器:PrintDocumentAdapter抽象类负责处理打印的生命周期:onStart()+onLayout()核心+onWrite()核心+onFinish()(另起一个线程,写入AsyncTask);
onLayout()用于计算打印文档信息,指定所创建文档类型+总页数+尺寸。
onWrite():将打印文档写入文件,参数指定了哪些页面要被写入以及要使用的输出文件+实现将每一个请求页的内容渲染成一个含有多个页面的PDF文件;
Note: Android打印框架可能会在每次调用onLayout()后,调用onWrite()方法一次甚至更多次。请务必牢记:当打印内容的布局没有变化时,将onLayoutFinished()设置为“false”,避免打印框架不必要的调用onLayout()方法,缓存之前的打印文档,提升执行性能。