diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e6f5d4..7a3b093 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,7 +22,10 @@ android:theme="@style/AppTheme" android:usesCleartextTraffic="true"> - + + + + - - + + + + + + - - - + + diff --git a/app/src/main/java/org/ntlab/amaryllis/client/TestPlayActivity.java b/app/src/main/java/org/ntlab/amaryllis/client/TestPlayActivity.java index a5fffe5..5c450ac 100644 --- a/app/src/main/java/org/ntlab/amaryllis/client/TestPlayActivity.java +++ b/app/src/main/java/org/ntlab/amaryllis/client/TestPlayActivity.java @@ -43,7 +43,7 @@ public void onServiceConnected(ComponentName name, IBinder service) { myService = ((TestVoiceService.MyBinder)service).getService(); //myService.setMessage("Hello, IBinder!"); - startService(serviceIntent); + //startService(serviceIntent); } @Override @@ -58,8 +58,8 @@ setContentView(R.layout.activity_test_play); button_play=findViewById(R.id.button_play); - textView_title=findViewById(R.id.textView_title); - textView_position=findViewById(R.id.textView_position); + //textView_title=findViewById(R.id.textView_title); + // textView_position=findViewById(R.id.textView_position); serviceIntent=new Intent( getBaseContext(),TestVoiceService.class ); @@ -67,9 +67,20 @@ button_play.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + + serviceIntent.setAction(TestVoiceService.ACTION_PLAY); + startService(serviceIntent); + //myService.testCall(); + } + }); + /* + button_play.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { myService.play(); } }); + */ //mPlayButton = (Button) findViewById(R.id.play); //mPlayButton.setOnClickListener(this); diff --git a/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/TestVoiceService.java b/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/TestVoiceService.java index 94c9cb3..d434eb0 100644 --- a/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/TestVoiceService.java +++ b/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/TestVoiceService.java @@ -34,18 +34,19 @@ import androidx.media2.exoplayer.external.ExoPlayer; -public class TestVoiceService extends IntentService { +public class TestVoiceService extends IntentService implements MediaPlayer.OnPreparedListener, + AudioManager.OnAudioFocusChangeListener { final String TAG = TestVoiceService.class.getSimpleName();//ログ用タグ final String ROOT_ID = "root";//クライアントに返すID onGetRoot / onLoadChildrenで使用 - public static final String ACTION_TOGGLE = "com.example.mediaplayerlock.ACTION_TOGGLE"; - public static final String ACTION_PLAY = "com.example.mediaplayerlock.ACTION_PLAY"; + public static final String ACTION_TOGGLE = "org.ntlab.amaryllis.client.voiceservice.ACTION_TOGGLE"; + public static final String ACTION_PLAY = "org.ntlab.amaryllis.client.voiceservice.ACTION_PLAY"; Handler handler;//定期的に処理を回すためのHandler private PlayListManager playListManager; - MediaPlayer mediaPlayer=new MediaPlayer(); + MediaPlayer mediaPlayer; AudioManager audioManager; RemoteControlClient mRemoteCtlClient; ComponentName sampleReceiver; @@ -54,7 +55,7 @@ enum State{PLAY,STOP,PAUSE}; State mState=State.STOP; - boolean isPlaying;//再生中であるかどうかを + int index = 0;//再生中のインデックス final IBinder myBinder=new MyBinder(); @@ -68,24 +69,81 @@ System.out.println("START SERVICE"); - mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } @Override public void onCreate() { super.onCreate(); - audioManager=(AudioManager) getSystemService(Context.AUDIO_SERVICE); - sampleReceiver=new ComponentName(this,VoicememoReceiver.class); + audioManager=(AudioManager) getSystemService(Context.AUDIO_SERVICE); + audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN); + + sampleReceiver=new ComponentName(this,VoicememoReceiver.class); + mediaPlayer=new MediaPlayer(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + String action = intent.getAction(); + + // ロック画面で再生/一時停止ボタン押下時 + if (action.equals(ACTION_TOGGLE)) { + if (mState == State.PAUSE || mState == State.STOP) { + // 停止/一時停止中の場合は再生 + playMusic(); + } else { + // 再生中の場合は一時停止 + mState = State.PAUSE; + mediaPlayer.pause(); + + if (mRemoteCtlClient != null) { + // リモートコントロールクライアントに状態をセットする + mRemoteCtlClient + .setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED); + } + } + } + + // MainActivityで再生ボタン押下時 + else if (action.equals(ACTION_PLAY)) { + if (mediaPlayer != null) { + clean(); + } + playMusic(); + } + + // サービス開始 or 既存サービスの再利用 + return START_NOT_STICKY; + } + public void clean() { + mState = State.STOP; + mediaPlayer.reset(); + mediaPlayer.release(); + mediaPlayer = null; + } + @Override + public void onAudioFocusChange(int i) { + + } + + public void onPrepared(MediaPlayer player) { + mState = State.PLAY; + if (!mediaPlayer.isPlaying()) { + mediaPlayer.start(); + } } public IBinder onBind(Intent intent){ Log.d(TAG,"onBind"); - return myBinder; + return null; + //return myBinder; } public void play(){ final String url = "http://nitta-lab-www.is.konan-u.ac.jp/data/c948c729-a516-4ca2-88f3-35c0f2d20dba.3gp"; + mediaPlayer=new MediaPlayer(); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mediaPlayer.reset(); @@ -93,7 +151,6 @@ mediaPlayer.prepare(); mediaPlayer.start(); - } catch (IOException e) { e.printStackTrace(); } @@ -109,9 +166,94 @@ // playListManager.getUnplayed().get(0); } + public void testCall(){ + System.out.println("CALL!!!!"); + } + public void playMusic() { + if (mState == State.STOP) { + // 停止中の場合はメディアプレーヤーに必要情報をセットして再生 + prepareAndPlay(); + } else if (mState == State.PAUSE && !mediaPlayer.isPlaying()) { + // 一時停止中の場合は再開する + mState = State.PLAY; + mediaPlayer.start(); + } + if (mRemoteCtlClient != null) { + // リモートコントロールクライアントに状態をセットする + mRemoteCtlClient + .setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); + } + } + public void prepareAndPlay() { + mState = State.STOP; + final String url = "http://nitta-lab-www.is.konan-u.ac.jp/data/c948c729-a516-4ca2-88f3-35c0f2d20dba.3gp"; + // メディアプレイヤーで再生する音楽をセットする + //mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.sample); + mediaPlayer=new MediaPlayer(); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + try { + mediaPlayer.reset(); + mediaPlayer.setDataSource(url); + mediaPlayer.prepare(); + // mediaPlayer.setLooping(true); + mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mediaPlayer) { + } + }); + //mediaPlayer.start(); + } catch (IOException e) { + e.printStackTrace(); + } + // メディアボタンレシーバーをセットする + audioManager.registerMediaButtonEventReceiver(sampleReceiver); + + // リモートコントローラーインスタンスを生成 + if (mRemoteCtlClient == null) { + + // リモートコントローラー用のIntentを生成 + Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON); + intent.setComponent(sampleReceiver); + + // PendingIntentインスタンスを取得 + PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, + intent, 0); + + // RemoteControlClientインスタンスを生成 + mRemoteCtlClient = new RemoteControlClient(pendingIntent); + + // オーディオマネージャーにクライアントをセットする + audioManager.registerRemoteControlClient(mRemoteCtlClient); + } + + // 利用するコントロール機能を指定する(以下では再生/一時停止/停止/次曲を指定) + mRemoteCtlClient + .setTransportControlFlags(RemoteControlClient.FLAG_KEY_MEDIA_PLAY + | RemoteControlClient.FLAG_KEY_MEDIA_PAUSE + | RemoteControlClient.FLAG_KEY_MEDIA_NEXT + | RemoteControlClient.FLAG_KEY_MEDIA_STOP); + + // RemoteControlClientにメタ情報をセットする + RemoteControlClient.MetadataEditor editMeta = mRemoteCtlClient.editMetadata(true); + +// editMeta.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, +// "アーティスト名") +// .putString(MediaMetadataRetriever.METADATA_KEY_TITLE, "曲名") +// +// // 曲の再生時間(ミリ秒) +// .putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, 50000).apply(); + + mediaPlayer.start(); + mState = State.PLAY; + + // リモートコントロールクライアントに状態をセットする + mRemoteCtlClient + .setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); + + } @Override protected void onHandleIntent(@Nullable Intent intent) { diff --git a/app/src/main/res/layout/activity_test_play.xml b/app/src/main/res/layout/activity_test_play.xml index e360d07..db84f9f 100644 --- a/app/src/main/res/layout/activity_test_play.xml +++ b/app/src/main/res/layout/activity_test_play.xml @@ -10,7 +10,7 @@ android:id="@+id/button_play" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Button" + android:text="Play" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"