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"