开发者

Android Audio via MediaPlayer not working in 2.2

As simple as it gets...

MediaPlayer player = MediaPlayer.create(context, R.raw.somemp3file);
player.start();

But nothing happens? From: http://developer.android.com/guide/topics/media/index.html

Android 2.2 @ HTC Desire

MediaPlayerService

06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): Client(28) constructor
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): Create new client(28) from pid 14284, fd=15, offset=26236, length=14760
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): setDataSource fd=15, offset=26236, length=14760
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): st_dev  = 7941
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): st_mode = 33188
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): st_uid  = 1000
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): st_gid  = 1000
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): st_size = 973395
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): player type = 4
06-11 22:11:00.392: DEBUG/MediaPlayerService(18690): player type = STAGEFRIGHT_PLAYER
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690):  create StagefrightPlayer
06-11 22:11:00.392: VERBOSE/MediaPlayerService(18690): [28] setAudioStreamType(3)
06-11 22:11:00.402: VERBOSE/MediaPlayerService(18690): [28] prepareAsync
06-11 22:11:00.402: VERBOSE/MediaPlayerService(18690): [28] notify (0x37b60, 5, 0, 0)
06-11 22:11:00.402: VERBOSE/MediaPlayerService(18690): [28] notify (0x37b60, 1, 0, 0)
06-11 22:11:00.402: VERBOSE/MediaPlayerService(18690): [28] setLooping(0)
06-11 22:11:00.402: VERBOSE/MediaPlayerService(18690): [28] setVolume(1.000000, 1.000000)
06-11 22:11:00.402: VERBOSE/MediaPlayerService(18690): [28] start
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): Client(29) constructor
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): Create new client(29) from pid 14284, fd=19, offset=26236, length=14760
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): setDataSource fd=19, offset=26236, length=14760
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): st_dev  = 7941
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): st_mode = 33188
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): st_uid  = 1000
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): st_gid  = 1000
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): st_size = 973395
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): player type = 4
06-11 22:11:00.592: DEBUG/MediaPlayerService(18690): player type = STAGEFRIGHT_PLAYER
06-11 22:11:00.592: VERB开发者_运维问答OSE/MediaPlayerService(18690):  create StagefrightPlayer
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): [29] setAudioStreamType(3)
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): [29] prepareAsync
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): [29] notify (0x26f10, 5, 0, 0)
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): [29] notify (0x26f10, 1, 0, 0)
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): [29] setLooping(0)
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): [29] setVolume(1.000000, 1.000000)
06-11 22:11:00.592: VERBOSE/MediaPlayerService(18690): [29] start
06-11 22:11:00.702: VERBOSE/MediaPlayerService(18690): [28] notify (0x37b60, 2, 0, 0)
06-11 22:11:00.792: VERBOSE/MediaPlayerService(18690): [29] notify (0x26f10, 2, 0, 0)
06-11 22:11:12.846: VERBOSE/MediaPlayerService(18690): disconnect(29) from pid 14284
06-11 22:11:12.846: VERBOSE/MediaPlayerService(18690): Client(29) destructor pid = 14284
06-11 22:11:12.846: VERBOSE/MediaPlayerService(18690): disconnect(29) from pid 14284
06-11 22:14:06.450: VERBOSE/MediaPlayerService(18690): Client(28) destructor pid = 14284
06-11 22:14:06.450: VERBOSE/MediaPlayerService(18690): disconnect(28) from pid 14284
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): Client(30) constructor
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): Create new client(30) from pid 14698, fd=15, offset=26233, length=14760
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): setDataSource fd=15, offset=26233, length=14760
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): st_dev  = 7941
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): st_mode = 33188
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): st_uid  = 1000
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): st_gid  = 1000
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): st_size = 973147
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690): player type = 4
06-11 22:22:00.460: DEBUG/MediaPlayerService(18690): player type = STAGEFRIGHT_PLAYER
06-11 22:22:00.460: VERBOSE/MediaPlayerService(18690):  create StagefrightPlayer
06-11 22:22:00.470: VERBOSE/MediaPlayerService(18690): [30] setAudioStreamType(3)
06-11 22:22:00.470: VERBOSE/MediaPlayerService(18690): [30] prepareAsync
06-11 22:22:00.470: VERBOSE/MediaPlayerService(18690): [30] notify (0x37b60, 5, 0, 0)
06-11 22:22:00.470: VERBOSE/MediaPlayerService(18690): [30] notify (0x37b60, 1, 0, 0)
06-11 22:22:00.470: VERBOSE/MediaPlayerService(18690): [30] setLooping(0)
06-11 22:22:00.470: VERBOSE/MediaPlayerService(18690): [30] setVolume(1.000000, 1.000000)
06-11 22:22:00.470: VERBOSE/MediaPlayerService(18690): [30] start
06-11 22:22:00.711: VERBOSE/MediaPlayerService(18690): disconnect(30) from pid 14698
06-11 22:22:00.711: VERBOSE/MediaPlayerService(18690): Client(30) destructor pid = 14698
06-11 22:22:00.711: VERBOSE/MediaPlayerService(18690): disconnect(30) from pid 14698
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): Client(31) constructor
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): Create new client(31) from pid 14698, fd=18, offset=26233, length=14760
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): setDataSource fd=18, offset=26233, length=14760
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): st_dev  = 7941
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): st_mode = 33188
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): st_uid  = 1000
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): st_gid  = 1000
06-11 22:22:00.730: VERBOSE/MediaPlayerService(18690): st_size = 973147
06-11 22:22:00.740: VERBOSE/MediaPlayerService(18690): player type = 4
06-11 22:22:00.740: DEBUG/MediaPlayerService(18690): player type = STAGEFRIGHT_PLAYER
06-11 22:22:00.740: VERBOSE/MediaPlayerService(18690):  create StagefrightPlayer
06-11 22:22:00.750: VERBOSE/MediaPlayerService(18690): [31] setAudioStreamType(3)
06-11 22:22:00.750: VERBOSE/MediaPlayerService(18690): [31] prepareAsync
06-11 22:22:00.750: VERBOSE/MediaPlayerService(18690): [31] notify (0x37b60, 5, 0, 0)
06-11 22:22:00.750: VERBOSE/MediaPlayerService(18690): [31] notify (0x37b60, 1, 0, 0)
06-11 22:22:00.750: VERBOSE/MediaPlayerService(18690): [31] setLooping(0)
06-11 22:22:00.750: VERBOSE/MediaPlayerService(18690): [31] setVolume(1.000000, 1.000000)
06-11 22:22:00.750: VERBOSE/MediaPlayerService(18690): [31] start
06-11 22:22:01.060: VERBOSE/MediaPlayerService(18690): [31] notify (0x37b60, 2, 0, 0)

AudioSink

06-11 22:11:00.402: VERBOSE/AudioSink(18690): setVolume(1.000000, 1.000000)
06-11 22:11:00.402: VERBOSE/AudioSink(18690): open(44100, 1, 1, 4)
06-11 22:11:00.402: VERBOSE/AudioSink(18690): setVolume
06-11 22:11:00.402: VERBOSE/AudioSink(18690): start
06-11 22:11:00.592: VERBOSE/AudioSink(18690): setVolume(1.000000, 1.000000)
06-11 22:11:00.592: VERBOSE/AudioSink(18690): open(44100, 1, 1, 4)
06-11 22:11:00.592: VERBOSE/AudioSink(18690): setVolume
06-11 22:11:00.592: VERBOSE/AudioSink(18690): start
06-11 22:11:00.702: VERBOSE/AudioSink(18690): pause
06-11 22:11:00.792: VERBOSE/AudioSink(18690): pause
06-11 22:11:12.846: VERBOSE/AudioSink(18690): stop
06-11 22:11:12.846: VERBOSE/AudioSink(18690): close
06-11 22:11:12.846: VERBOSE/AudioSink(18690): close
06-11 22:14:06.450: VERBOSE/AudioSink(18690): stop
06-11 22:14:06.450: VERBOSE/AudioSink(18690): close
06-11 22:14:06.450: VERBOSE/AudioSink(18690): close
06-11 22:22:00.470: VERBOSE/AudioSink(18690): setVolume(1.000000, 1.000000)
06-11 22:22:00.470: VERBOSE/AudioSink(18690): open(44100, 1, 1, 4)
06-11 22:22:00.470: VERBOSE/AudioSink(18690): setVolume
06-11 22:22:00.470: VERBOSE/AudioSink(18690): start
06-11 22:22:00.711: VERBOSE/AudioSink(18690): stop
06-11 22:22:00.711: VERBOSE/AudioSink(18690): close
06-11 22:22:00.711: VERBOSE/AudioSink(18690): close
06-11 22:22:00.750: VERBOSE/AudioSink(18690): setVolume(1.000000, 1.000000)
06-11 22:22:00.750: VERBOSE/AudioSink(18690): open(44100, 1, 1, 4)
06-11 22:22:00.750: VERBOSE/AudioSink(18690): setVolume
06-11 22:22:00.750: VERBOSE/AudioSink(18690): start
06-11 22:22:01.060: VERBOSE/AudioSink(18690): pause

This is one from plain simple Android Project with just those two lines.

06-11 22:55:40.521: INFO/ActivityManager(96): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.test.test/.Test2Activity }
06-11 22:55:40.531: INFO/AndroidRuntime(15849): NOTE: attach of thread 'Binder Thread #3' failed
06-11 22:55:40.710: DEBUG/ProtoRequestListener(96): requestFailed()
06-11 22:55:40.940: DEBUG/dalvikvm(2564): GC_EXPLICIT freed 43 objects / 2120 bytes in 66ms
06-11 22:55:42.870: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0x7a7100), pid=207, w=480, h=800
06-11 22:55:42.870: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0x7a7100), pid=207, w=480, h=800
06-11 22:55:42.890: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0x7a7100), index=0, pid=207, w=480, h=800 success
06-11 22:55:43.190: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0x7a7100), index=1, pid=207, w=480, h=800 success
06-11 22:55:45.080: DEBUG/AndroidRuntime(15862): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
06-11 22:55:45.080: DEBUG/AndroidRuntime(15862): CheckJNI is OFF
06-11 22:55:45.080: DEBUG/dalvikvm(15862): creating instr width table
06-11 22:55:45.130: DEBUG/AndroidRuntime(15862): --- registering native functions ---
06-11 22:55:45.390: DEBUG/AndroidRuntime(15862): Shutting down VM
06-11 22:55:45.390: DEBUG/dalvikvm(15862): Debugger has detached; object registry had 1 entries
06-11 22:55:45.400: INFO/AndroidRuntime(15862): NOTE: attach of thread 'Binder Thread #3' failed
06-11 22:55:45.540: DEBUG/AndroidRuntime(15871): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
06-11 22:55:45.540: DEBUG/AndroidRuntime(15871): CheckJNI is OFF
06-11 22:55:45.540: DEBUG/dalvikvm(15871): creating instr width table
06-11 22:55:45.591: DEBUG/AndroidRuntime(15871): --- registering native functions ---
06-11 22:55:45.850: INFO/ActivityManager(96): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.test.test/.Test2Activity }
06-11 22:55:45.860: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0x6d7d70), pid=96, w=1, h=1
06-11 22:55:45.860: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0x6d7d70), pid=96, w=1, h=1
06-11 22:55:45.880: DEBUG/AndroidRuntime(15871): Shutting down VM
06-11 22:55:45.880: DEBUG/dalvikvm(15871): Debugger has detached; object registry had 1 entries
06-11 22:55:45.890: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0x6d7d70), index=0, pid=96, w=480, h=800 success
06-11 22:55:45.910: INFO/AndroidRuntime(15871): NOTE: attach of thread 'Binder Thread #3' failed
06-11 22:55:45.930: INFO/MediaPlayer(15789): MediaPlayer create(context,resid) 
06-11 22:55:45.930: INFO/MediaPlayer(15789): MediaPlayer 
06-11 22:55:45.940: VERBOSE/AudioCache(18690): We only support url check function now.
06-11 22:55:45.940: VERBOSE/AudioCache(18690): isQCPFileFormat() url=(null)
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] reset (382)
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] reset_l (388)
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] reset_l (478)
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] setDataSource (319)
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] reset_l (388)
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] reset_l (478)
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] setDataSource_l (339)
06-11 22:55:45.940: DEBUG/MediaExtractor(18690): [U5B] Create (47)
06-11 22:55:45.940: VERBOSE/MediaExtractor(18690): Autodetected media content as 'audio/mpeg' with confidence 0.30
06-11 22:55:45.940: DEBUG/AwesomePlayer(18690): [U5B] setDataSource_l (350)
06-11 22:55:45.950: INFO/MediaPlayer(15789): MediaPlayer start()
06-11 22:55:45.950: DEBUG/AwesomePlayer(18690): [U5B] play (556)
06-11 22:55:45.950: DEBUG/AwesomePlayer(18690): [U5B] play_l (562)
06-11 22:55:45.950: DEBUG/AudioPolicyManagerBase(18690): startOutput() output 1, stream 3
06-11 22:55:45.950: DEBUG/AwesomePlayer(18690): [U5B] play_l (635)
06-11 22:55:45.961: INFO/MediaPlayer(15789): MediaPlayer handleMessage what=5
06-11 22:55:45.961: INFO/MediaPlayer(15789): MediaPlayer handleMessage what=1
06-11 22:55:45.961: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0x668610), pid=15789, w=1, h=1
06-11 22:55:45.961: DEBUG/SurfaceFlinger(96): Layer::setBuffers(this=0x668610), pid=15789, w=1, h=1
06-11 22:55:45.990: DEBUG/SurfaceFlinger(96): Layer::requestBuffer(this=0x668610), index=0, pid=15789, w=480, h=800 success
06-11 22:55:46.000: INFO/ActivityManager(96): Displayed activity com.test.test/.Test2Activity: 122 ms (total 122 ms)
06-11 22:55:46.150: INFO/AudioHardwareQSD(18690): AUDIO_START: start kernel pcm_out driver.
06-11 22:55:46.162: WARN/AudioFlinger(18690): write blocked for 204 msecs, 46 delayed writes, thread 0x15440
06-11 22:55:46.251: INFO/MediaPlayer(15789): MediaPlayer handleMessage what=2
06-11 22:55:46.251: DEBUG/AwesomePlayer(18690): [U5B] pause_l (705)
06-11 22:55:49.310: INFO/AudioHardwareQSD(18690): AudioHardware pcm playback is going to standby.
06-11 22:55:50.710: DEBUG/ProtoRequestListener(96): requestFailed()


Problem? You must specify audioStreamType before .prepare()! So this is working.

MediaPlayer player = new MediaPlayer();
AssetFileDescriptor afd = this.getResources().openRawResourceFd(R.raw.alarm);
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.setLooping(true);
player.prepare();
player.start();

But if you remove

player.setAudioStreamType(AudioManager.STREAM_ALARM);

it won't work. If you use MediaPlayer.create(context, resid) - the static method itself will make prepare before you use

player.setAudioStreamType(AudioManager.STREAM_ALARM);

because body of the method is (see mp.prepare() before return statement)

public static MediaPlayer create(Context context, int resid) {
    try {
        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
        if (afd == null)
            return null;

        MediaPlayer mp = new MediaPlayer();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        afd.close();
        mp.prepare();
        return mp;
    } catch (IOException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    } catch (SecurityException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    }
    return null;
}

So use the snippet at the beginning or use own static method

public static MediaPlayer create(Context context, int resid, boolean looping) {
    try {
        AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
        MediaPlayer mp = new MediaPlayer();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        afd.close();

        mp.setAudioStreamType(AudioManager.STREAM_ALARM);
        if (looping) mp.setLooping(true);

        mp.prepare();
        return mp;
    } catch (IOException ex) {
        Log.d("MediaPlayer", "create failed:", ex);
        // fall through
    } catch (IllegalArgumentException ex) {
        Log.d("MediaPlayer", "create failed:", ex);
        // fall through
    } catch (SecurityException ex) {
        Log.d("MediaPlayer", "create failed:", ex);
        // fall through
    }
    return null;
}

and use it in your activity as (third argument is to loop the sound or not)

MediaPlayer player = MainActivity.create(this, R.raw.alarm, true);
player.start();
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜