2011-07-17 14 views
1

私は現在listviewを持っています。アイテムをクリックするとにmediaplayerが表示されます。 listviewの別の項目をクリックすると、実行中のserviceが停止し、新しいserviceを実行する必要があります。私はbooleanisRunningをfalseに設定しています。サービスが作成されるとtrueを返します。それでlistviewで私はifステートメントでそのフラグを呼び出します。しかし、その正確に動作していません。私はこれが間違っているかもしれないと思う。何か案は?Android-listview、service mediaplayer、and boolean flags

これはおそらく私がそれを記述した方法を混乱させると思われます。私のlistviewと私のserviceのコードはここにあります。私はケース3でのみこれをテストしています(サービスを開始するためにこの項目を押してから、ケース2をクリックして停止するかどうかを確認します)。

リストビュークラス:

public class PlaylistActivity extends ListActivity{ 

    private static final String TAG = PlaylistActivity.class.getSimpleName(); 

    // Data to put in the ListAdapter 
    private String[] sdrPlaylistNames = new String[] { 
      "Best of June 2011", "Best of May 2011", "Dubstep", 
      "House", "Other"}; 

    private ListAdapter sdrListAdapter; 
    Intent playbackServiceIntentBOJ, playbackServiceIntentBOM, playbackServiceIntentDUB; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playlists_layout); 
     //fill the screen with the list adapter 
     playlistFillData(); 

     playbackServiceIntentDUB = new Intent(this, DUBAudioService.class); 
     Log.d(TAG, "Made DUB Service Intent"); 
    } 

    public void playlistFillData() { 
     //create and set up the Array adapter for the list view 
     ArrayAdapter sdrListAdapter = new ArrayAdapter(this, R.layout.list_item, sdrPlaylistNames); 
     setListAdapter(sdrListAdapter); 
    } 

    //set up the on list item Click 
    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     //create a switch so that each list item is a different playlist 
     switch(position){ 
     case 0: 
      Intent BOJintent = new Intent(this, BOJAudioActivity.class); 
      // Create the view using PlaylistGroup's LocalActivityManager 
      View view = PlaylistGroup.group.getLocalActivityManager() 
      .startActivity("show_city", BOJintent 
      .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
      .getDecorView(); 

      // Again, replace the view 
      PlaylistGroup.group.replaceView(view); 

     // playbackServiceIntentBOJ = new Intent(this, BOJAudioService.class); 
       Log.d(TAG, "Made BOJ Intent"); 
     // startService(playbackServiceIntentBOJ); 
       Log.d(TAG, "started BOJ Service"); 

      break; 
     case 1: 
      Intent BOMintent = new Intent(this, BOMAudioActivity.class); 
      // Create the view using PlaylistGroup's LocalActivityManager 
      View view2 = PlaylistGroup.group.getLocalActivityManager() 
      .startActivity("show_city", BOMintent 
      .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
      .getDecorView(); 

      // Again, replace the view 
      PlaylistGroup.group.replaceView(view2); 
       Log.d(TAG, "Replace view"); 

       //getApplicationContext().stopService(playbackServiceIntentBOJ); 

      //playbackServiceIntentBOM = new Intent(this, BOJAudioService.class); 
       Log.d(TAG, "Made BOM Service Intent"); 
     // startService(playbackServiceIntentBOM); 
       Log.d(TAG, "started BOM Service"); 

       if(DUBAudioActivity.isRunningDUB = true){ 
        stopService(playbackServiceIntentDUB); 
        Log.d(TAG, "stop service isRunningDUB"); 
       } 
// 
      break; 
     case 2: 

      Intent DUBIntent = new Intent (this, DUBAudioActivity.class); 
      View view3 = PlaylistGroup.group.getLocalActivityManager() 
         .startActivity("show_city", DUBIntent 
           .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) 
           .getDecorView(); 
      PlaylistGroup.group.replaceView(view3); 
       Log.d(TAG, "Replace view"); 

      startService(playbackServiceIntentDUB); 
       Log.d(TAG, "started DUB service"); 

      break; 

     } 


    } 


} 

サービスクラス:

public class DUBAudioService extends Service implements OnPreparedListener, OnCompletionListener{ 

Toast loadingMessage; 

private static final String TAG = DUBAudioService.class.getSimpleName(); 

    public static boolean isRunningDUB = false; 

    //to keep track of the playlist item 
    Vector<PlaylistFile> playlistItems; 

    MediaPlayer mediaPlayer; 

    String baseURL = ""; 

    //keep track of which item from the vector we are on 
    int currentPlaylistltemNumber = 0; 

    public class DUBBackgroundAudioServiceBinder extends Binder { 
     DUBAudioService getService() { 
     return DUBAudioService.this; 
     } 
    } 

    private final IBinder basBinderDUB = new DUBBackgroundAudioServiceBinder(); 



    @Override 
    public IBinder onBind(Intent intent) { 
     return basBinderDUB; 
    } 

    @Override 
    public void onCreate() { 
     Log.v("PLAYERSERVICE", "onCreate"); 
     mediaPlayer = new MediaPlayer(); 
     new MusicAsync().execute(); 
      Log.d(TAG, "execute'd async"); 
     mediaPlayer.setOnPreparedListener(this); 
      Log.d(TAG, "set on prepared listener"); 
     mediaPlayer.setOnCompletionListener(this); 
      Log.d(TAG, "set on completion listener"); 

      isRunningDUB = true; 
      Log.d(TAG, "isRunningRUB = true"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     //if (!mediaPlayer.isPlaying()) { 
     // mediaPlayer.start(); 
     //} 
     return START_STICKY; 
    } 


    class MusicAsync extends AsyncTask<Void,Void,Void>{ 
     @Override 
     protected void onPreExecute(){ 
     } 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 

      //create empty vector 
      playlistItems = new Vector<PlaylistFile>(); 

      //HTTP client library 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpGet getRequest = new HttpGet ("http://dl.dropbox.com/u/24535120/m3u%20playlist/DubstepPlaylist.m3u"); //i think you could add the m3u thing in here 

      Log.v("URI",getRequest.getURI().toString()); 

      try { 
      HttpResponse httpResponse = httpClient.execute(getRequest); 
      if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { 
      // ERROR MESSAGE 
      Log.v("HTTP ERROR",httpResponse.getStatusLine().getReasonPhrase()); 
      } 
      else { 
       InputStream inputStream = httpResponse.getEntity().getContent(); 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        Log.v("PLAYLISTLINE","ORIG: " + line); 

        if (line.startsWith("#")) { 
         //Metadata 
         //Could do more with this but not fo now 
        } else if (line.length() > 0) { 
         String filePath = ""; 
          if (line.startsWith("http://")) { 
          // Assume its a full URL 
           filePath = line; 
          } else { 
          //Assume it’s relative 
          filePath = getRequest.getURI().resolve(line).toString(); 
          } 

          PlaylistFile playlistFile = new PlaylistFile(filePath); 
          playlistItems.add (playlistFile); 
          } 
          } 
          inputStream.close(); 
          } 
          } catch (ClientProtocolException e) { 
           e.printStackTrace(); 
          } catch (IOException e) { 
          e. printStackTrace(); 
          } 


          currentPlaylistltemNumber = 0; 
          if (playlistItems.size() > 0) 
          { 
          String path = ((PlaylistFile)playlistItems.get(currentPlaylistltemNumber)).getFilePath(); 
          try { 
           mediaPlayer.setDataSource(path); 

          mediaPlayer.prepareAsync();} 
          catch (IllegalArgumentException e) 
          { e.printStackTrace(); 
          }catch (IllegalStateException e) { 
           e.printStackTrace(); 
          }catch (IOException e) { 
          e.printStackTrace();} 
          } 



      return null; 
     } 
     // 
     protected void onPostExecute(Void result){ 
      //playButton. setEnabled (false); 
     } 
    } 



    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 


    } 

    public void onDestroy() { 
     if (mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
      Log.d(TAG, "music stopp'd"); 
     } 
     //mediaPlayer.release(); 
     Log.d(TAG, "onDestroy"); 
    } 

    @Override 
    public void onPrepared(MediaPlayer mediaPlayer) { 
     // TODO Auto-generated method stub\ 
     Log.d(TAG, "music is prepared and will start"); 
     mediaPlayer.start(); 
    } 

    public void onCompletion(MediaPlayer _mediaPlayer) { 
     Log.d(TAG, "Song completed, next song"); 
     mediaPlayer.stop(); 
     mediaPlayer.reset(); 
      if (playlistItems.size() > currentPlaylistltemNumber + 1) { 
       currentPlaylistltemNumber++; 
      String path = 
       ((PlaylistFile)playlistItems.get(currentPlaylistltemNumber)).getFilePath(); 
       try { 
        mediaPlayer.setDataSource(path); 
        mediaPlayer.prepareAsync(); 
       } catch (IllegalArgumentException e) { 
        e. printStackTrace(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
    } 

    class PlaylistFile { 
     String filePath; 
      public PlaylistFile(String _filePath) { 
       filePath = _filePath; 
      } 
      public void setFilePath(String _filePath) { 
       filePath = _filePath; 
      } 
      public String getFilePath() { 
       return filePath; 
      } 
     } 


    public void playSong(){ 
     Log.d(TAG, "start'd"); 
     mediaPlayer.start(); 
    } 

    public void pauseSong(){ 
     Log.d(TAG, "pause'd"); 
     mediaPlayer.pause(); 
    } 



} 
+1

非常に同じ問題で同じボートの作業をしていますが、レイアウトはどのように 'ListView'のように見えますか? –

答えて

0

これはかなり複雑になりますが、私は私のサービスが実行されたかどうかを確認するために、次の使用:私は私のlistviewクラスでこれを追加

private boolean isMyServiceRunning() { 
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
    if ("com.example.MyService".equals(service.service.getClassName())) { 
     return true; 
    } 
} 
return false; 
} 

をし、それが実行している場合されたかどうかを確認するために、それぞれの場合にif文を入れますしたがってserviceを停止します。

私は、私のすべてのバインディングをpublicにして、listviewクラスがそれらにアクセスしてクリックでそれらを開始できるようにしました。

誰かがさらに理解したいなどの場合は、私にメッセージしてください。

0

あなたのサービス、あなたのアプリが状態を追跡しないようにしましょう。