diff --git a/app/src/main/java/org/ntlab/amaryllis/client/MainActivity.java b/app/src/main/java/org/ntlab/amaryllis/client/MainActivity.java index ccf7ad7..4b964b2 100644 --- a/app/src/main/java/org/ntlab/amaryllis/client/MainActivity.java +++ b/app/src/main/java/org/ntlab/amaryllis/client/MainActivity.java @@ -13,7 +13,10 @@ import android.app.AlarmManager; import android.app.Notification; import android.app.PendingIntent; +import android.content.ComponentName; +import android.content.Context; import android.content.Intent; +import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.location.Location; @@ -22,7 +25,10 @@ import android.location.LocationProvider; import android.os.Bundle; import android.os.Debug; +import android.os.IBinder; +import android.os.RemoteException; import android.provider.Settings; +import android.support.v4.media.session.MediaControllerCompat; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -32,10 +38,12 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; +import org.ntlab.amaryllis.client.entities.AmaryllisBackgroundService; import org.ntlab.amaryllis.client.entities.Category; import org.ntlab.amaryllis.client.fragment.MapsFragment; import org.ntlab.amaryllis.client.resources.AccountsRest; import org.ntlab.amaryllis.client.resources.CategoriesRest; +import org.ntlab.amaryllis.client.voiceservice.TestVoiceService; import java.util.ArrayList; import java.util.HashMap; @@ -58,6 +66,28 @@ ImageButton stopbutton; ImageButton skipbutton; + + AmaryllisBackgroundService myService; + MediaControllerCompat mediaController; + ServiceConnection serviceConnection = new ServiceConnection(){ + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + myService = ((AmaryllisBackgroundService.MyBinder)service).getService(); + try { + mediaController=new MediaControllerCompat(MainActivity.this,myService.getToken()); + } catch (RemoteException e) { + e.printStackTrace(); + } + //myService.setMessage("Hello, IBinder!"); + //startService(serviceIntent); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + myService = null; + } + }; + int playfrag=0; int stopfrag=0; @@ -98,8 +128,12 @@ }); + //アクティビティとサービスを接続 + bindService(new Intent(getBaseContext(),AmaryllisBackgroundService.class),serviceConnection, Context.BIND_AUTO_CREATE); + //収音関係のボタンの処理 playbutton = (ImageButton)findViewById(R.id.playbutton); + playbutton.setEnabled(true); playbutton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { playfrag++; @@ -108,6 +142,7 @@ }else{ //こっち側がオン } + mediaController.getTransportControls().play(); } }); stopbutton = (ImageButton)findViewById(R.id.stopbutton); @@ -119,12 +154,14 @@ }else{ //こっち側がオン } + + mediaController.getTransportControls().pause(); } }); skipbutton = (ImageButton)findViewById(R.id.skipbutton); skipbutton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - + mediaController.getTransportControls().skipToNext(); } }); @@ -134,6 +171,10 @@ return; } manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); + + + + } private void locationStart(){ diff --git a/app/src/main/java/org/ntlab/amaryllis/client/entities/AmaryllisBackgroundService.java b/app/src/main/java/org/ntlab/amaryllis/client/entities/AmaryllisBackgroundService.java index 0d1153c..2bd2ad0 100644 --- a/app/src/main/java/org/ntlab/amaryllis/client/entities/AmaryllisBackgroundService.java +++ b/app/src/main/java/org/ntlab/amaryllis/client/entities/AmaryllisBackgroundService.java @@ -58,7 +58,7 @@ AudioManager audioManager; MediaSessionCompat mediaSession; ComponentName sampleReceiver; - enum State{PLAY,STOP,PAUSE}; + public enum State{PLAY,STOP,PAUSE}; AmaryllisBackgroundService.State mState; VoiceMemo currentVoicememo;//再生中のヴォイスメモ //---------------- @@ -83,6 +83,7 @@ .addConverterFactory(JacksonConverterFactory.create()) .build(); final VoicememosRest voicememosRest=retrofit.create(VoicememosRest.class); + playListManager=new PlayListManager(); Call> call=voicememosRest.getVoicememos(145.0,0.0,145.0,0.0); call.enqueue(new Callback>() { @Override @@ -110,7 +111,7 @@ }); { - mState = AmaryllisBackgroundService.State.STOP; + mState = State.STOP; sampleReceiver=new ComponentName(this, VoicememoReceiver.class); mediaPlayer=new MediaPlayer(); mediaSession=new MediaSessionCompat(getApplicationContext(),TAG); @@ -119,6 +120,7 @@ MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS | //キュー系のコマンドの使用をサポート MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS ); //再生、停止、スキップ等のコントロールを提供 + mediaSession.setCallback(callback); } @@ -143,9 +145,15 @@ private void callPlayEnd(){ for(PlayListListener pl:playListListeners)pl.onPlayEnd(); } + public MediaSessionCompat.Token getToken(){ return mediaSession.getSessionToken(); } + + public State getState(){ + return mState; + } + @Override public int onStartCommand(Intent intent, int flags, int startId) { String action = intent.getAction(); @@ -233,9 +241,19 @@ break; case STOP: - currentVoicememo=playListManager.getUnplayedList().get(0); - // final String url = "http://nitta-lab-www.is.konan-u.ac.jp/data/c948c729-a516-4ca2-88f3-35c0f2d20dba.3gp"; - final String url="http://nitta-lab-www.is.konan-u.ac.jp/data/"+playListManager.getUnplayedList().get(0).getData(); + currentVoicememo=playListManager.getNextVoicememo(); + if(currentVoicememo==null){ + System.out.println("NULLだよ"); + mState=State.STOP; + clean(); + return; + } + + //callPlayNext(currentVoicememo); + // final String url = "http://nitta-lab-www.is.konan-u.ac.jp/data/c948c729-a516-4ca2-88f3-35c0f2d20dba.3gp"; + final String url=currentVoicememo.getData(); + // final String url="http://nitta-lab-www.is.konan-u.ac.jp/data/fa96472f-1833-47e7-9297-880e9d02f2f2.3gp"; + // final String url="http://nitta-lab-www.is.konan-u.ac.jp/data/b9f241de-5728-4538-88ba-1672c9fc0196.3gp"; mediaPlayer=new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); @@ -243,19 +261,21 @@ mediaPlayer.reset(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); - mediaPlayer.start(); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { mState=State.STOP; onPlay(); + callPlayEnd(); } }); - CreateNotification(); + mediaPlayer.start(); + } catch (IOException e) { e.printStackTrace(); } + CreateNotification(); break; case PAUSE: mediaPlayer.start(); @@ -305,7 +325,14 @@ //次の曲をリクエストされたとき @Override public void onSkipToNext() { - final String url="http://nitta-lab-www.is.konan-u.ac.jp/data/"+playListManager.getUnplayedList().get(0).getData(); + if(playListManager.getNextVoicememo()==null){ + mState=State.STOP; + return; + } + currentVoicememo=playListManager.getNextVoicememo(); + + // final String url = "http://nitta-lab-www.is.konan-u.ac.jp/data/c948c729-a516-4ca2-88f3-35c0f2d20dba.3gp"; + final String url="http://nitta-lab-www.is.konan-u.ac.jp/data/"+currentVoicememo.getData(); mediaPlayer=new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); @@ -383,7 +410,7 @@ .addAction(new NotificationCompat.Action( R.drawable.ic_baseline_pause_circle_outline_24, getString(R.string.app_name), MediaButtonReceiver.buildMediaButtonPendingIntent(this, - PlaybackStateCompat.ACTION_PLAY_PAUSE))) + PlaybackStateCompat.ACTION_PAUSE))) .addAction(new NotificationCompat.Action( R.drawable.ic_baseline_play_circle_outline_24, getString(R.string.app_name), MediaButtonReceiver.buildMediaButtonPendingIntent(this, diff --git a/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/PlayListManager.java b/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/PlayListManager.java index ec09458..f524526 100644 --- a/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/PlayListManager.java +++ b/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/PlayListManager.java @@ -14,7 +14,7 @@ if(voicememos.get(i).getVid().equals(playlist.get(j).getVid())) exist = true; } - if(exist = false) + if(exist == false) playlist.add(voicememos.get(i)); } } @@ -31,14 +31,14 @@ // unplayedlist.clear(); // unplayedlist.add(playlist.get(index)); - for(int i = 0;i < unplayedlist.size(); i++) { + for(int i = index;i < playlist.size(); i++) { boolean exist = false; - for(int j= index;j < playlist.size(); j++){ - if(playlist.get(j).getVid().equals(unplayedlist.get(i).getVid())) + for(int j= 0;j < unplayedlist.size(); j++){ + if(playlist.get(i).getVid().equals(unplayedlist.get(j).getVid())) exist = true; } - if(exist = false) - playlist.add(unplayedlist.get(i)); + if(exist == false) + unplayedlist.add(playlist.get(i)); } for(int i = index; i < playlist.size(); i++){ unplayedlist.add(playlist.get(i)); @@ -47,6 +47,7 @@ } public VoiceMemo getNextVoicememo(){ + if(getUnplayedList().size()==0)return null; VoiceMemo result=getUnplayedList().remove(0); next(); return result; diff --git a/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/VoicememoReceiver.java b/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/VoicememoReceiver.java index bdc2c8e..011140b 100644 --- a/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/VoicememoReceiver.java +++ b/app/src/main/java/org/ntlab/amaryllis/client/voiceservice/VoicememoReceiver.java @@ -12,6 +12,7 @@ import android.view.KeyEvent; import org.ntlab.amaryllis.client.TestPlayActivity; +import org.ntlab.amaryllis.client.entities.AmaryllisBackgroundService; public class VoicememoReceiver extends BroadcastReceiver { TestVoiceService myService; @@ -30,7 +31,7 @@ public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) { - Intent startServiceIntent = new Intent(context,TestVoiceService.class); + Intent startServiceIntent = new Intent(context, AmaryllisBackgroundService.class); KeyEvent keyEvent = (KeyEvent) intent.getExtras().get( Intent.EXTRA_KEY_EVENT); @@ -45,7 +46,7 @@ break; case KeyEvent.KEYCODE_MEDIA_PLAY: // 再生ボタン押下時の処理を記述 - startServiceIntent.setAction(TestVoiceService.ACTION_PLAY); + startServiceIntent.setAction(AmaryllisBackgroundService.ACTION_PLAY); context.startService(startServiceIntent); break; case KeyEvent.KEYCODE_MEDIA_PAUSE: