如何从Android上的不同片段控制播放器

时间:2014-08-29 19:01:18

标签: android android-fragments

请,我需要从两个不同的片段控制我的流音频播放器: Radiofragment和AboutFragment。

这是我的无线电片段

public class RadioFragment extends Fragment implements
MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener{

AudioManager am;
ImageButton btnPlay = null;
private boolean isPlaying;
private PlayerManager playerManager;
private View view;

public RadioFragment(boolean p, PlayerManager pmanager){
    this.isPlaying = p;
    this.playerManager = pmanager;
}
@Override
public View onCreateView(LayoutInflater l, ViewGroup container, Bundle onSavedInstance){
    super.onCreateView(l, container, onSavedInstance);
    view = l.inflate(R.layout.activity_radio, container, false);
    return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    btnPlay = (ImageButton)view.findViewById(R.id.btnPlay);
    addButtonListeners();

}
private void addButtonListeners() 
{
    btnPlay.setAlpha(155);
    btnPlay.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) 
        {
            onClickBtnPlay(v);
        }
    });



}

protected void onClickBtnPlay(View v) 
{
    if (isPlaying){
        playerManager.pause();
        isPlaying = false;
    }
    else{
        if (playerManager == null){
            playerManager = new PlayerManager(getString(R.string.link_streaming_radio), RadioFragment.this);
        }

        playerManager.play();
        isPlaying = true; 

    }
}

@Override
public boolean onError(MediaPlayer mp, int what, int extra) 
{
    StringBuilder sb = new StringBuilder();
    sb.append("Media Player Error: ");
    switch (what)
    {
        case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
            sb.append("Not Valid for Progressive Playback");
            break;
        case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
            sb.append("Server Died");
            break;
        case MediaPlayer.MEDIA_ERROR_UNKNOWN:
            sb.append("Unknown");
            break;
        default:
            sb.append(" Non standard (");
            sb.append(what);
            sb.append(")");
    }

    sb.append(" (" + what + ") ");
    sb.append(extra);
    Log.e(MainActivity.TAG, sb.toString());

    return true;
}

@Override
public void onPrepared(MediaPlayer mp) 
{
    mp.start();
}

@Override
public void onCompletion(MediaPlayer mp) 
{
    mp.stop();
}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent)
{
    Log.d(MainActivity.TAG, "PlayerService onBufferingUpdate : " + percent + "%");
}

}

在我的AboutFragment中,我有一个带有播放/暂停按钮的布局和

protected void onClickBtnPlay(View v) 
{
    if (isPlaying){
        playerManager.pause();
        isPlaying = false;
    }
    else{
        if (playerManager == null){
            playerManager = new PlayerManager(getString(R.string.link_streaming_radio), AboutFragment.this);
        }

        playerManager.play();
        isPlaying = true; 

    }
}

这是我控制玩家的类:

public class PlayerManager{
private String xmlUrl;
private String server;
private MediaPlayer mp;

public PlayerManager(Fragment owner) 
{
    this.owner = owner;
    this.server = ""; 
}

public void play()
{
    server = path_to_server;
        playMusic();
}

public void pause()
{
    mp.stop();
    mp.reset(); 
}

private void playMusic() 
{
    Uri myUri = Uri.parse(this.server);

    try
    {
        if (mp == null){
            this.mp = new MediaPlayer();
        }
        else{
            mp.stop();
            mp.reset();
        }

        mp.setDataSource(owner.getActivity(), myUri); // Go to Initialized state
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOnPreparedListener((OnPreparedListener) this.owner);
        mp.setOnBufferingUpdateListener((OnBufferingUpdateListener) this.owner);
        mp.setOnErrorListener((OnErrorListener) this.owner);
        mp.setVolume(100,100);
        mp.prepareAsync();

        Log.d(MainActivity.TAG, "Done");
    }
    catch (Throwable t)
    {
        Log.d(MainActivity.TAG, t.toString());
    }   
}

}

可以通过这种实现来完成,还是我必须使用另一种方法? 因为我试图通过构造函数传递playerManager,但它似乎在其他活动上下文中 所以我得到了类强制转换异常。我还尝试传递Radiofragment上下文并获得一些空指针异常 从上面的最后一个捕获区块开始。

我在这里需要一些亮点,请... 提前谢谢你!

1 个答案:

答案 0 :(得分:0)

您应该有foreground Service,其中包含PlayerManager。然后,您将从所需的任何活动或片段发送播放/暂停命令。