2013-10-02 49 views
0

我以前发布过这个问题,没有人能回答,所以我再次尝试,因为这个问题使我的应用程序变得毫无价值。当屏幕超时或用户点按电源按钮时,我需要继续播放声音。我已经阅读了几乎所有关于唤醒锁的在线文章,我可以找到并且无法使其工作。下面是根据用户选择的输入播放声音的.Java文件之一。除了当屏幕变暗时声音停止播放,一切都很好。只是一个说明,我对此很新,所以如果这个代码是草率或多余的请让我知道。唤醒锁定不起作用

package com.androidsleepmachine.gamble; 

import android.app.Activity; 
import android.content.Context; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.PowerManager; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 

public class Ship extends Activity implements View.OnClickListener { 
public static final Integer[] TIME_IN_MINUTES = { 30, 45, 60, 180, 360 }; 
public MediaPlayer mediaPlayer; 
public Handler handler = new Handler(); 
public Button button2; 
public Spinner spinner2; 
public PowerManager.WakeLock wl; 


// Initialize the activity 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
"Playwhenoff"); 

    super.onCreate(savedInstanceState); 
    wl.acquire(); 
    setContentView(R.layout.ship); 
    button2 = (Button) findViewById(R.id.btn2); 
    button2.setOnClickListener(this); 
    spinner2 = (Spinner) findViewById(R.id.spinner2); 
    ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(this, 
      android.R.layout.simple_spinner_item, TIME_IN_MINUTES); 

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner2.setAdapter(adapter); 

} 

// Play the sound and start the timer 
private void playSound(int resourceId) { 
    // Cleanup any previous sound files 
    cleanup(); 
    // Create a new media player instance and start it 

    mediaPlayer = MediaPlayer.create(this, resourceId); 
    mediaPlayer.start(); 
    // Create the timer to stop the sound after x number of milliseconds 
    int selectedTime = TIME_IN_MINUTES[spinner2.getSelectedItemPosition()]; 
    handler.postDelayed(runnable, selectedTime * 60 * 1000); 
} 

// Handle button callback 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.btn2: 
     playSound(R.raw.ocean_ship); 
     break; 
    } 
} 

protected void onStop() { 

    cleanup(); 
    super.onStop(); 
} 

// Stop the sound and cleanup the media player 
public void cleanup() { 
    if (mediaPlayer != null) { 
     mediaPlayer.stop(); 
     mediaPlayer.release(); 
     mediaPlayer = null; 
     wl.release(); 
    } 
    // Cancel any previously running tasks 
    handler.removeCallbacks(runnable); 
} 

// Runnable task used by the handler to stop the sound 
public Runnable runnable = new Runnable() { 
    public void run() { 
     cleanup(); 
    } 
}; 


@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    wl.release(); 
} 

} 

回答

1

这可能与WakeLock无关。当屏幕关闭时,您的活动可能会被拨打onStop()

音频播放器通常使用服务进行音频播放,因此播放可以独立于此类UI关注运行。

+0

好吧,我想我明白你说的一点点。当我删除清理();从onStop();当我关闭屏幕时音频仍然播放,问题就是它不会停下来。我如何解决这个问题 – user2727048

+0

@ user2727048:正如我写的,音频播放器通常使用服务进行音频播放,因此播放可以独立于此类UI关注运行。您的用户界面将命令发送到服务以启动和停止播放。 – CommonsWare

+0

我明白你的意思了,但我对这个真的很陌生,我不知道如何实施从我的活动播放声音到播放声音的服务的更改 – user2727048

0

您正在释放您激活锁定的onPause - >

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    wl.release(); // -> This is the line where you release the wakelock 
} 

当你的设备 “进入睡眠状态”,它是这样的onPause - >的onStop。

如果您释放您的wakelock onPause,您将无法在屏幕关闭的情况下播放音乐,因为系统不会让CPU唤醒。

释放它在其他地方(也许onDestroy?),它应该工作。

+0

我是否需要删除onPause方法并创建onDestroy方法并将其放置在那里? – user2727048

+0

是的,请尝试并让我知道。 –

+0

@Override \t保护无效的onDestroy(){ \t \t // TODO自动生成方法存根 \t \t super.onDestroy(); \t \t wl.release(); \t} 我收到一条消息,称wakelocks应该在onPause中释放而不是在onDestroy上。当我按下电源按钮切断屏幕时,它也会停止播放声音 – user2727048