Android基础知识复习(三)

学习内容

  1. Google Android Training
    http://developer.android.com/training/index.html
  2. Github托管
    https://github.com/kesenhoo/android-training-course-in-chinese
  3. 中文阅读地址
    http://hukai.me/android-training-course-in-chinese/index.html

以下是仅对我个人有意义的笔记

3. Android多媒体

3.1. 管理音频播放

3.1.1. 控制音量与音频播放

  1. 用硬件来控制音量(onCreate)

    setVolumeControlStream(AudioManager.STREAM_MUSIC);
    
  2. manifest上注册一个广播就可以接收硬件(耳机或者物理按钮)对音频的播放,在activity监听intent事件,对不同事件做不同处理。

  3. 存在多个程序在监听与媒体按钮相关的事件,所以需要在代码中控制应用接收相关事件的时机。使用AudioManager为应用注册监听与取消监听媒体按钮事件,当Receiver被注册上时,它将是唯一一个能够响应媒体按钮广播的Receiver。

3.1.2. 管理音频焦点

  1. 获取音频焦点,requestAudioFocus(),AUDIOFOCUS_REQUEST_GRANTED表示成功。另外必须指定正在使用的音频流+所请求的音频焦点是永久(比如播放音乐)/暂时(比如播放导航指示)。
  2. 获取永久焦点播放完成之后要调用abandonAudioFocus()方法。这样相当于告知系统我们不再需要获取焦点并且注销所关联的AudioManager.OnAudioFocusChangeListener监听器。
  3. Ducking模式,只在信息来的时候凸显一下,之后就对现在的播放毫无影响
  4. 当接受到描述焦点改变的事件时会触发onAudioFocusChange()回调方法:永久失去,短暂失去,允许Ducking的短暂失去。

3.1.3. 兼容音频输出设备

  1. AudioManager来检测使用了什么播放硬件
  2. 系统会在切换硬件播放器的情况下,广播带有ACTION_AUDIO_BECOMING_NOISY的Intent。无论何时播放音频,我们都应该注册一个BroadcastReceiver来监听这个Intent。

3.2. 拍照

3.2.1. 简单的拍照

  1. 设置获取相机权限(先用hasSystemFeature(PackageManager.FEATURE_CAMERA)查看是否有相机)
  2. 拍照:发送一个Intent来捕获照片,用startActivityForResult()来吊起这个服务,在这之前需要resolveActivity()来检查是否有Activity可以处理这个intent。
  3. 在onActivityResult处理照片:存放到相册、解码一副缩放图(现在第三方的技术已经很成熟了,源码了解一下原理就可以了)

3.2.2. 简单的录像

  1. 跟用相机拍摄照片是一样的,用的API不一样而已

3.2.3. 控制相机硬件

  1. 在onCreate里面另起一个线程,在这个线程里对Camera进行操作(避免阻碍UI线程)/在onResume里面去打开Camera
  2. Camera被硬件调用的时候,方法会抛出Exception,用try捕获然后操作。
  3. 预览Preview,就是打开相机的时候不是漆黑一片,而是有图像的(我还以为这是相机本身就有的……原来是设定过的?)一个Camera实例与它相关的Preview必须按照特定的顺序来创建,通常来说Camera对象优先被创建。
  4. 修改相机设置 用Camera.Parameters
  5. 设置预览方向 setCameraDisplayOrientation()
  6. 拍摄照片Camera.takePicture():Camera.PictureCallback与Camera.ShutterCallback对象并将他们传递到Camera.takePicture()中。
  7. 在预览Surface组件被销毁之后要停止预览并释放相机

3.3. 打印

3.3.1. 打印照片

  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文档

  1. webview(可写xml/直接在activity里纯代码实现一个webview)显示HTML文档,然后实现打印
    • Note: 请确保在WebViewClient)中的onPageFinished()方法内调用创建打印任务的方法。如果没有等到页面加载完毕就进行打印,打印的输出可能会不完整或空白,甚至可能会失败。
    • Note:在上面的样例代码中,保留了一个WebView对象实例的引用,这样能够确保它不会在打印任务创建之前就被垃圾回收器所回收。在编写代码时请务必这样做,否则打印的进程可能会无法继续执行。
  2. HTML的文档可以是String形式/本地文件/网络文件
  3. 创建打印任务:PrintManager+ PrintDocumentAdapter

3.3.3. 打印自定义文档

  1. 命名一个打印任务+设置一个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); //
    }
    
  2. 创建打印适配器:PrintDocumentAdapter抽象类负责处理打印的生命周期:onStart()+onLayout()核心+onWrite()核心+onFinish()(另起一个线程,写入AsyncTask);

    • onLayout()用于计算打印文档信息,指定所创建文档类型+总页数+尺寸。

    • onWrite():将打印文档写入文件,参数指定了哪些页面要被写入以及要使用的输出文件+实现将每一个请求页的内容渲染成一个含有多个页面的PDF文件;

    • Note: Android打印框架可能会在每次调用onLayout()后,调用onWrite()方法一次甚至更多次。请务必牢记:当打印内容的布局没有变化时,将onLayoutFinished()设置为“false”,避免打印框架不必要的调用onLayout()方法,缓存之前的打印文档,提升执行性能。

猜你喜欢

转载自blog.csdn.net/sunyejia/article/details/78417771