Training - Multimedia & Graphics & Animation

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 presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...

// Stop listening for button presses
am.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 playback
int 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 playback
int 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值