Training - Multimedia & Graphics & Animation

来源:互联网 发布:unity3d游戏制作教程 编辑:程序博客网 时间:2024/05/06 21:15

Building Apps with Multimedia

总结:1、stream type  2. key event  3. audio focus  4、check headset...

Managing Audio Playback

Controlling Your App's Volume and Playback

Identify Which Audio Stream to Use

1.choose audio stream

Use Hardware Volume Keys to Control Your App's Audio Volume

setAudioVolumeControlStream() - > 可控制音量键事件

setVolumeControlStream(AudioManager.STREAM_MUSIC);
Use Hardware Playback Control Keys to Control Your App's Audio Playback

有的机器有play, pause...等等音乐播放的按钮,或者有些耳机提供按钮——所谓“线控”

这些按钮按下去后,系统发出一个broadcast intent, ACTION_MEDIA_BUTTON, EXTRA_KEY_EVENT,  KeyEvent类,KEYCODE_MEDIA_*

<receiver android:name=".RemoteControlReceiver">    <intent-filter>        <action android:name="android.intent.action.MEDIA_BUTTON" />    </intent-filter></receiver>
public class RemoteControlReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {            KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);            if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {                // Handle key press.            }        }    }}
动态注册reciever(动态注册receiver之后,只有这个receiver可以接收这个intent)

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);...// Start listening for button pressesam.registerMediaButtonEventReceiver(RemoteControlReceiver);...// Stop listening for button pressesam.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
Managing Audio Focus
2. audio focus
Request the Audio Focus

1. AudioManager.requestAudioFoucs()   2. audio focus 分为 permanent,   transient   3. abandonAudioFocus()

AudioManager.OnAudioFocusChangeListener

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);...// Request audio focus for playbackint result = am.requestAudioFocus(afChangeListener,                                 // Use the music stream.                                 AudioManager.STREAM_MUSIC,                                 // Request permanent focus.                                 AudioManager.AUDIOFOCUS_GAIN);   if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {    am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);    // Start playback.}
// Abandon audio focus when playback complete    am.abandonAudioFocus(afChangeListener);
ducking (duck的含义见原文链接)

// Request audio focus for playbackint result = am.requestAudioFocus(afChangeListener,                             // Use the music stream.                             AudioManager.STREAM_MUSIC,                             // Request permanent focus.                             AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);   if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {    // Start playback.}
Handle the Loss of Audio Focus

onAudioFocusChange()

Duck!

duck就是暂时降低一下音量

OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {    public void onAudioFocusChange(int focusChange) {        if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {            // Lower the volume        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {            // Raise it back to normal        }    }};
Dealing with Audio Output Hardware

Check What Hardware is Being Used

if (isBluetoothA2dpOn()) {    // Adjust output for Bluetooth.} else if (isSpeakerphoneOn()) {    // Adjust output for Speakerphone.} else if (isWiredHeadsetOn()) {    // Adjust output for headsets} else {     // If audio plays and noone can hear it, is it still playing?}
Handle Changes in the Audio Output Hardware

拔掉耳机之后,扬声器会突然很大声音的情况。原文
(Boradcast Intent)

Capturing Photos

Taking Photos Simply : 调用其他拍照程序

声明依赖摄像头特性

<manifest ... >    <uses-feature android:name="android.hardware.camera" android:required="false" /></manifest ... >
PackageManager.hasSystemFeature(....)

private void dispatchTakePictureIntent(int actionCode) {    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    startActivityForResult(takePictureIntent, actionCode);}
public static boolean isIntentAvailable(Context context, String action) {    final PackageManager packageManager = context.getPackageManager();    final Intent intent = new Intent(action);    List<ResolveInfo> list =            packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);    return list.size() > 0;}
onActivityResult()获得图片数据(仅仅是thumnail):
private void handleSmallCameraPhoto(Intent intent) {    Bundle extras = intent.getExtras();    mImageBitmap = (Bitmap) extras.get("data");    mImageView.setImageBitmap(mImageBitmap);}
要保存图片,需传给Intent一个File(表示输出文件路径)

File f = createImageFile();takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
将该照片添加到Gallery:

private void galleryAddPic() {    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);    File f = new File(mCurrentPhotoPath);    Uri contentUri = Uri.fromFile(f);    mediaScanIntent.setData(contentUri);    this.sendBroadcast(mediaScanIntent);}
Recording Videos Simply: //TODO

Controlling the Camera

//TODO





Media Playback

已看完

Supported Media Formats

尽管可以随意使用codec,但是最好选用平台无关的codec。

Android支持的网络协议(多媒体相关):原文

Android支持的编码格式:原文   CamcorderProfile 类

视频参数配置建议: 原文

Audio Capture//TODO

JetPlayer//TODO

Camera//TODO