3

私はサービスとしてMediaPlayer経由でラジオを再生するアプリを持っています。 MediaControllerをServiceクラスで使用することは可能ですか? 問題はfindViewByIdを使用できることです。Android:サービスクラスでmediaControllerを使用するには?

私はonPrepeared methiodで私のLinearLayoutを取得しよう...

public class RadioPlayer extends Service implements OnPreparedListener, MediaController.MediaPlayerControl { 
    @Override 
    public void onCreate() { 
    super.onCreate(); 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    mediaPlayer.setOnPreparedListener(this); 
    mediaController = new MediaController(this, false); mediaPlayer.setDataSource(url); 
    mediaPlayer.prepareAsync(); 
} 

@Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
    mediaPlayer.start(); 
    mediaController.setMediaPlayer(this); 
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    View layout = inflater.inflate(R.layout.main, (ViewGroup) findViewById(R.id.main_program_view)); 
    mediaController.setAnchorView(layout); 
} 
} 

main.xmlファイル

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/main_program_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#FFFFFF" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/now_playing_text" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="30dp" 
      android:gravity="center" 
      android:text="@string/na_antenie" 
      android:textColor="#333333" />  
</LinearLayout> 

答えて

6

あなたはあなたのサービスでのMediaControllerクラスを使用することはできません。サービスにはGUIが含まれていないため、findViewByIdはサービスで認識されません。 代わりに、mediaControllerを実装するアクティビティを作成してから、サービスを作成し、アクティビティにバインドします。したがって、あなたのサービス内にはmediaPlayerがあり、あなたのアクティビティにはコントローラがあります。

これは、アクティビティクラスの概要です。

public class MusicPlayerActivity extends Activity implements MediaController.MediaPlayerControl{ 
//Do all the stuff 
void initMusic(){ 
    mMediaController = new MediaController(this,false); 
    //Note do not create any variable of mediaplayer 
    mMediaController.setMediaPlayer(this);  
    mMediaController.setAnchorView(findViewById(R.id.anchorText)); 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
     startService(new Intent("PLAY_MUSIC")); 
     } 
    }).start(); 
     MusicService.setPathOfSong("Provide the path"); 

} 
} 

これはサービスクラスの概要です。

public class MusicService extends Service implements MediaPlayer.OnPreparedListener { 
private MediaPlayer mMediaPlayer; 
private static String pathOfSong; 
public int onStartCommand(Intent intent, int flags, int startId) { 
     mMediaPlayer=new MediaPlayer(); 
     mMediaPlayer.setOnPreparedListener(this); 
     //Other stuff 
} 
public static void setPathOfSong(String path) 
{ 
    pathOfSong=path; 
} 
} 
4

私は同じ問題を抱えていました。私は同じ問題を抱えていました。

解決策は、アクティビティでサービスをバインドすることです。次に、アクティビティ内からサービスで実行されているMediaPlayerにアクセスすることができます。

それがこの方法を実行するように注意してください、あなたのサービスがgetCurrentPositionのようにすべての必要なメソッドを定義しておく必要がありますなど、あなたの活動に

バインディング機能を追加します(

/****************************************************************** 
* 
* Defines callbacks for service binding, passed to bindService() 
* 
* ************************************************************** */ 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
      IBinder service) { 
     // We've bound to LocalService, cast the IBinder and get LocalService instance 
     LocalBinder binder = (LocalBinder) service; 
     mService = binder.getService(); 
     mBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 
}; 

は、その後、あなたがONSTARTを変更する必要があります)およびonStop()メソッドを使用してサービスをバインド/アンバインドします。私は、次のメソッドを作成するために

public void showMediaControllerHere(){ 
    if (mBound){ 
     mc = new MediaController(mpContext); 
     mc.setAnchorView(findViewById(R.id.anchorText)); 
     mc.setMediaPlayer(mService); 
     mc.setEnabled(true); 
     mc.show(0); 
    } 
} 
@Override 
    public boolean onTouchEvent(MotionEvent event) { 
    //the MediaController will hide after 3 seconds - tap the screen to make it appear again 
    if (first){ 
      if (mBound){ 
       showMediaControllerHere(); 
       first = false; 
      } 
     } 
     else { 
      if (mBound){ 
       mc.show(0); 
      } 
     } 
    return false; 
    } 

最初は、我々はのMediaControllerかどうかを作成する必要があるかどうかを実現するために使用されるブール値です、後でしたが、私が初めてでのみ作成何

@Override 
protected void onStart() { 
    super.onStart(); 
    // Bind to LocalService 
    Intent intent = new Intent(this, MusicService.class); 
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    // Unbind from the service 
    if (mBound) { 
     unbindService(mConnection); 
     mBound = false; 
    } 
} 

ユーザは画面に触れる。

関連する問題