马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
android 多媒体和相机详解$ U) q0 a2 X6 y0 N
处理AUDIO_BECOMING_NOISYIntent* [- C! e6 G, z6 u! [
很多良好的音频播放的应用都会在那些导致声音变为噪音(通过外部扬声器输出)的事件发生时自动停止播放.例如,这可能发生在当一个用户用耳机听音乐时忽然断开了耳机连接.音频从扬声器播放可能不是用户期望的.
! _) U& Z3 z! ~; u. O! x1 Y* `* l2 q; G$ z' o7 U; y" e9 V+ E3 t
9 y( m" Z. J5 q7 q3 j! @# w$ N" O# `
* [' l9 q7 j1 r0 C4 ~5 Q0 D. r7 p7 L/ P. ?/ R8 g
你可以通过处理ACTION_AUDIO_BECOMING_NOISYintent 来保证你的应用在此情况下停止播放音乐,你可以把如下代码添加到你的manifest来注册一个receiver:+ O3 [( O; \) O8 a S
7 X9 L1 T) K6 w4 V! G
# n% t9 a$ k) [[java]
1 h: D& B3 @ F, ^0 J, b<receiver android:name=".MusicIntentReceiver"> % T, U' [: m8 }% W" Z1 q2 |* G
<intent-filter> L) n4 L/ W7 B, h2 }1 o. I, Z
<action android:name="android.media.AUDIO_BECOMING_NOISY" /> 0 B! e, V3 z3 G' a+ |3 v5 ^! A, g/ [
</intent-filter>
3 g9 Z {, m$ ~7 o& v</receiver> / }. k/ s9 N, ^
b( C% ]* Z$ R" Y& f) N
<receiver android:name=".MusicIntentReceiver">
; q9 m, d1 s% c5 j& G/ N' _ <intent-filter>
, A/ `* D+ O+ H* F4 r, k* F <action android:name="android.media.AUDIO_BECOMING_NOISY" />
' ]; j6 V: u F </intent-filter>
5 H1 ^) ]1 D; r+ F3 J/ S6 p</receiver>- B7 s ]& x o$ y+ `9 }4 L
, S9 \) }: i# J
此段把MusicIntentReceiver类作为这个intent的一个广播接收器(broadcastreceiver)进行注册,下面就是要实现这个类:1 L4 _( R( s3 a! P: {. C& |3 q
5 R3 x1 l J) v7 o* C a' n. A1 r, g* w5 Z1 \" L! j4 S j
[java]
6 b9 [. ?3 q; N9 L" Wpublic class MusicIntentReceiver implements android.content.BroadcastReceiver {
" y9 `. p1 ?3 X3 M4 A @Override + J, o' i7 Z2 Z2 i! l) |) r$ X
public void onReceive(Context ctx, Intent intent) {
# V q$ {8 ^+ D5 [6 l, Q a4 v if (intent.getAction().equals(
& u* z4 ~/ k2 K! o7 j) O' Y) j android.media.AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
% ^2 i! h3 T x" d m // 通知你的service停止播放 ' }8 [" E s: F$ A
// (比如通过一个Intent) . R# q; M% j; @
} " b* J1 g0 D+ U' T" F
}
4 i( { h: y: ~}
) W# l6 ~+ |0 Z8 a/ _- t2 n1 q% @* N! U
public class MusicIntentReceiver implements android.content.BroadcastReceiver {
$ f8 E5 v% D4 B @Override. \- o: i9 p8 D# J& E' [
public void onReceive(Context ctx, Intent intent) {
# s1 ?/ p. W( ~: s& {/ ~ if (intent.getAction().equals(
1 B# z' U; _& D0 _% _& s android.media.AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
( ?+ a8 X, h, Q' g2 c$ c // 通知你的service停止播放4 ~1 {7 K# x: w, A
// (比如通过一个Intent)1 L/ _8 S0 y# V, ]7 j
}
- X: i) g& r; D) X$ P }+ _% [ i" r: X
}从一个ContentResolver获取媒体
. B. H: Y7 q( q6 W$ [, }5 G& {' v2 L5 z
" @- ~/ A2 c n, [$ b' O1 l 媒体播放应用的是另一个有用的特性是检索用户存放在设备上的音乐.你可以通过从ContentResolver查询媒体来做到:
5 u: }5 q4 n- ^5 ^5 b0 W7 l, Q" W( H+ K- Z' p
2 k& ]3 y. _4 J* h$ x
[java]6 Y; _) U& M& u
ContentResolver contentResolver = getContentResolver();
2 K. T0 c9 _. o, l' eUri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
5 t6 _0 e. K& T8 @/ g: G$ uCursor cursor = contentResolver.query(uri, null, null, null, null);
# s" r: k5 P ?. i/ l& m5 Uif (cursor == null) { : ~! Z$ E: y g5 _9 o
// 查询失败,处理错误 ; p$ g3 e- H6 }5 l9 p5 b* k2 ?1 c
} else if (!cursor.moveToFirst()) { / t" H+ D' L+ `$ Q: |
// 设备上没有媒体 4 U, U# F! A U a: {+ c Z1 }
} else { 1 s* ]$ }0 \2 e$ G+ C; m& r
int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE); ; T3 ^# N0 G$ {) T2 u
int idColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID);
! j# b7 m' i' ^ do {
) P- j" E$ ]/ B% v4 K1 G% { long thisId = cursor.getLong(idColumn); 7 H2 ?9 E! ^9 v& }
String thisTitle = cursor.getString(titleColumn);
' A) d' Z) r% N, g2 E // ...process entry...
7 G5 B9 T( a& H! q# H# F$ r$ {# o( G6 g } while (cursor.moveToNext()); 9 E+ s4 K5 B$ C0 u0 \! Z
}
7 V1 N/ f& b/ ?' b2 u- b1 o# M; v: g/ L4 n& k: o+ _
ContentResolver contentResolver = getContentResolver();
$ K( I$ j& m/ P, a2 _Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;4 E1 `* e) `( ?" Y" b( J% ^6 \/ V
Cursor cursor = contentResolver.query(uri, null, null, null, null);* D; d/ S) ^' Z+ Y6 Y; T' z
if (cursor == null) {
0 x+ w/ q5 B8 V7 o // 查询失败,处理错误. H% h \; u( R3 q6 W. W8 T2 K% N
} else if (!cursor.moveToFirst()) {0 }; L3 U8 ^. ]2 a
// 设备上没有媒体& t, d O* N, x4 ?
} else {
/ d, v/ k8 s# w* D. x int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
. e$ ?7 L) J% j3 l' y int idColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID);
1 J# v5 U- J8 c6 e! h* W. I do {/ r. g) @: ~3 N* |$ Z
long thisId = cursor.getLong(idColumn);$ M5 f' C! ]& ?& j
String thisTitle = cursor.getString(titleColumn);
5 }, ]8 C/ Q2 q$ R // ...process entry...: h# X% a- @8 C+ h0 @2 n
} while (cursor.moveToNext());; G. Z' u& c: S
}6 o; f/ v2 X# k4 y! R
# W; Y9 B% k4 y. @5 j, }; V
9 g3 `5 b" Q% n/ ?6 E/ o* v. m* _0 B6 S
要在MediaPlayer中播放获取到的媒体,你可以这样做:
2 b$ }2 {5 o8 I" z1 K7 D
5 M+ |5 t% w9 H! V, @
# d9 p1 H8 G0 ?% l- r+ s2 Z[java]
2 k/ D* R" y2 Y3 t+ d flong id = /* 上面获取到的某个条目的id */;
2 H% R; J+ f G* h; j5 A2 LUri contentUri = ContentUris.withAppendedId(
5 ?# H9 M% v' x# h3 |: v4 e android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
3 p5 s: k/ f; k) B- V
/ B% j% y( L2 u7 e) E: \$ }1 VmMediaPlayer = new MediaPlayer();
5 m0 `( Y( ^) q* Z3 b/ @mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 7 ]( `" x' ~/ B! Z& \5 o( J
mMediaPlayer.setDataSource(getApplicationContext(), contentUri); 2 }, Z f& s9 y2 [7 X$ h" r& l
4 l$ `2 \0 e, I D// ...prepare and start... # J8 u5 y8 M k; E
5 _% T' J, H! t5 @% R
long id = /* 上面获取到的某个条目的id */;
7 H f1 N) I) a, Y3 t9 l2 B, N! ^6 DUri contentUri = ContentUris.withAppendedId(7 Z U; _0 p: ^; n9 F
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
1 _* i: a' T+ Q8 [' K: {6 u
( h: y1 I+ k( Z$ u$ p5 xmMediaPlayer = new MediaPlayer();8 I, _% Q" Q) j5 x0 C! v4 D1 L
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
( z j! m# ?8 PmMediaPlayer.setDataSource(getApplicationContext(), contentUri);
" ?- T- L0 w4 C# j: E
3 M8 i6 P1 \3 j- B// ...prepare and start...+ \5 n: T8 A" s' X1 {
* f p" K& e* N2 E! t6 Q( c
' s2 \5 n0 M7 Y# `' L$ ~) R& |" @* e; _- ]/ R
JetPlayer: @! W7 n7 D, a0 v/ Z9 E1 b) ^9 e( _
Android平台包含一个JET引擎,用它可以添加交互式播放的JET音频内容到你的应用.你可以使用SDK所带的JetCreator应用来创建JET内容.要播放和管理JET内容,使用JetPlayer类.$ u- d/ ]" |: N& Y# n4 i7 l
' }& s) y* u' V: k9 h
! I- p% \% E3 w6 l# A/ R, w$ O2 o6 y3 ]4 ?5 C C
' @9 q- u I8 B9 i! Z" _. ~播放JET内容1 s0 @+ ^! }4 l; o7 j: P
本节教给你如何写出,配置和播放JET内容.JET的概念,介绍以及如何使用JetCreator工具创建JET内容,请看JetCreator用户手册,这里不叨叨.这个工具可以在Windows,OS X, 和Linux平台(Linux上不能像Windows和OSX上那样对导入的资产进行试听)上使用.
, i. i" J% {) A6 y& H/ K
8 J* l8 F' J# e* T' x+ `- a1 S
- a& G5 x# Q2 d! k+ x& _% J, p% }下面是如何对存储在SD卡上的一个.jet文件配置JET回放:
) }- w! t. q% H& L! n3 I, K7 s3 q8 x! x# s
" g# Y/ D$ V2 p6 T% j) ~! N$ [! q6 H[java] JetPlayer jetPlayer = JetPlayer.getJetPlayer();
' F3 B3 c3 Z- J o) I# VjetPlayer.loadJetFile("/sdcard/level1.jet"); ( d& g$ u8 b4 s; q' g( D
byte segmentId = 0; 3 O1 z0 v, C+ l7 r( |# {2 P
) R( `( m% T8 F' N( o3 b5 z; h' Y
// queue segment 5, repeat once, use General MIDI, transpose by -1 octave 1 B, s4 \% L, j$ Y
jetPlayer.queueJetSegment(5, -1, 1, -1, 0, segmentId++); ; e. S/ |1 ?& }* o/ z
// queue segment 2
1 M7 z% B! y5 e- D5 CjetPlayer.queueJetSegment(2, -1, 0, 0, 0, segmentId++); 5 @* A0 w/ [$ y
/ J3 @; @9 w% g5 @2 [: DjetPlayer.play(); www.2cto.com
; O3 [# N- g+ h0 ? U! N5 P+ A- h: c% c1 J
JetPlayer jetPlayer = JetPlayer.getJetPlayer();
6 k# l1 @) Z# j% n$ Z) q( FjetPlayer.loadJetFile("/sdcard/level1.jet");2 W z* P8 b7 r7 q' v0 V( a0 L
byte segmentId = 0;+ c# x1 m+ l! C; I1 U) i
! ^+ \' _+ |/ ^2 T# \
// queue segment 5, repeat once, use General MIDI, transpose by -1 octave7 x) L6 T% e. Z9 L+ c
jetPlayer.queueJetSegment(5, -1, 1, -1, 0, segmentId++); K& A7 M ~ T# y6 I
// queue segment 2
, J6 \; D4 \" v9 o4 r2 y- VjetPlayer.queueJetSegment(2, -1, 0, 0, 0, segmentId++);
, W$ ~# V- o* a6 K/ `; g/ Y4 K5 z& f3 R2 b3 }* {
jetPlayer.play(); f# I1 K/ V5 V+ \4 @/ {3 J
@ j' y# U/ h. K
, L8 u4 _/ S! V' TSDK包含一个例子— JetBoy —它向你演示了如何使用JetPlayer在你的游戏中创建一个交互式音轨.它也演示了如何使用JET事件来同步音乐和游戏逻辑.4 w5 }4 t/ g ~7 |; e3 l
, H9 d4 s: l: ~. b7 f/ L |