2011-07-21 67 views
1

我有一个活动,执行MediaController.MediaPlayerControlmediaPlayer和后退按钮

音频播放器播放文件就好了,但按下后退按钮后我无法离开活动。

当后退按钮被按下时,我在日志中得到这2条消息。目前的活动似乎继续进行得很好。

WARN/KeyCharacterMap(522): No keyboard for id 0 
WARN/KeyCharacterMap(522): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 

如果我将MediaController.MediaPlayercontrol的实现从活动中移出,则后退按钮将按预期工作。

有关如何解决此问题的任何想法?

这是我的课。我把不相关的部分拿出来,所以希望我没有把这个副本搞砸。

public class ContentActivity extends Activity implements OnPreparedListener, MediaController.MediaPlayerControl { 

private static final String TAG = "AudioPlayer"; 
private MediaPlayer mediaPlayer; 
private MediaController mediaController; 
private String audioFile; 
private Handler handler = new Handler(); 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.content); 


audioFile = "http://example.com/foo.mp3" 
mediaPlayer = new MediaPlayer(); 
mediaPlayer.setOnPreparedListener(this); 

mediaController = new MediaController(this){ 
    @Override 
    public void hide() { 
     this.show(0); 
    } 

    @Override 
    public void setMediaPlayer(MediaPlayerControl player) { 
     super.setMediaPlayer(player); 
     this.show(); 
    } 
}; 

mediaPlayer.setDataSource(audioFile); 
mediaPlayer.prepare(); 
} 

@Override 
protected void onStop() { 
super.onStop(); 
mediaPlayer.stop(); 
mediaPlayer.release(); 
} 

//--MediaPlayerControl methods---------------------------------------------------- 
public void start() { 
    mediaPlayer.start(); 
} 

public void pause() { 
    mediaPlayer.pause(); 
} 

public int getDuration() { 
    return mediaPlayer.getDuration(); 
} 

public int getCurrentPosition() { 
    return mediaPlayer.getCurrentPosition(); 
} 

public void seekTo(int i) { 
    mediaPlayer.seekTo(i); 
} 

public boolean isPlaying() { 
    return mediaPlayer.isPlaying(); 
} 

public int getBufferPercentage() { 
    return 0; 
} 

public boolean canPause() { 
    return true; 
} 

public boolean canSeekBackward() { 
    return true; 
} 

public boolean canSeekForward() { 
    return true; 
} 
//-------------------------------------------------------------------------------- 
public void onPrepared(MediaPlayer mediaPlayer) { 
    Log.d(TAG, "onPrepared"); 
    mediaController.setMediaPlayer(this); 
    mediaController.setAnchorView(findViewById(R.id.mediaController)); 

    handler.post(new Runnable() { 
     public void run() { 
     mediaController.setEnabled(true); 
     mediaController.show(); 
     } 
    }); 
}} 

堆栈

----- pid 632 at 2011-07-21 13:53:37 ----- 

DALVIK THREADS: 
"main" prio=5 tid=3 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x4001b268 self=0xbd00 
    | sysTid=632 nice=0 sched=0/0 cgrp=default handle=-1344001384 
    at android.os.BinderProxy.transact(Native Method) 
    at android.app.ActivityManagerProxy.handleApplicationError(ActivityManagerNative.java:2358) 
    at com.android.internal.os.RuntimeInit.crash(RuntimeInit.java:339) 
    at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:76) 
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:887) 
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:884) 
    at dalvik.system.NativeStart.main(Native Method) 

"Binder Thread #4" prio=5 tid=17 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44cd5370 self=0x3d6878 
    | sysTid=648 nice=0 sched=0/0 cgrp=default handle=3645656 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #3" prio=5 tid=15 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44cd52b0 self=0x3d5ca8 
    | sysTid=647 nice=0 sched=0/0 cgrp=default handle=4013152 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #2" prio=5 tid=13 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44c03da0 self=0x137be8 
    | sysTid=637 nice=0 sched=0/0 cgrp=default handle=1281760 
    at dalvik.system.NativeStart.run(Native Method) 

"Binder Thread #1" prio=5 tid=11 NATIVE 
    | group="main" sCount=1 dsCount=0 s=N obj=0x44c00a48 self=0x12def8 
    | sysTid=636 nice=0 sched=0/0 cgrp=default handle=1159488 
    at dalvik.system.NativeStart.run(Native Method) 

"JDWP" daemon prio=5 tid=9 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x44bfe2a0 self=0x138d18 
    | sysTid=635 nice=0 sched=0/0 cgrp=default handle=1193192 
    at dalvik.system.NativeStart.run(Native Method) 

"Signal Catcher" daemon prio=5 tid=7 RUNNABLE 
    | group="system" sCount=0 dsCount=0 s=N obj=0x44bfe1e8 self=0x1233b0 
    | sysTid=634 nice=0 sched=0/0 cgrp=default handle=1239344 
    at dalvik.system.NativeStart.run(Native Method) 

"HeapWorker" daemon prio=5 tid=5 VMWAIT 
    | group="system" sCount=1 dsCount=0 s=N obj=0x436a13f8 self=0x118bc8 
    | sysTid=633 nice=0 sched=0/0 cgrp=default handle=1163392 
    at dalvik.system.NativeStart.run(Native Method) 

----- end 632 ----- 
+0

哇。这是发生在模拟器,物理设备还是两者? – Shlublu

+0

模拟器和我的物理设备都会发生这种情况。当我点击回家后,大约需要20秒钟,然后我得到一个“对不起......已经意外停止,请再试一次。[Force close]” – Coder1

+0

你会发布堆栈跟踪的副本吗?必须有一个你可以捕捉到的。 – Shlublu

回答

2

试试这个,当你创建新的MediaController,覆盖dispatchKeyEvent该事件传递给活动

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    ContentActivity.this.dispatchKeyEvent(event); 
}