2013-05-02 9 views
12

Ich habe Code Meine Aktivität wie unten:Android Abspielen von Musik im Hintergrund

public class Player extends Activity implements OnCompletionListener, 
OnPreparedListener, OnErrorListener, OnBufferingUpdateListener, MusicFocusable { 

    private Boolean playState = false; 
    private String station = "http://38.101.19.5:9157"; 
    public static final float DUCK_VOLUME = 0.1f; 
    private String artistName = null; 
    private String trackName = null; 

    private TextView artist; 
    private TextView track; 
    private TextView status; 
    private Button play; 

    enum AudioFocus { 
     NoFocusNoDuck, // we don't have audio focus, and can't duck 
     NoFocusCanDuck, // we don't have focus, but can play at a low volume 
         // ("ducking") 
     Focused // we have full audio focus 
    } 

    private AudioFocus mAudioFocus = AudioFocus.NoFocusNoDuck; 

    private MediaPlayer mPlayer = null; 
    private AndroidShoutcastLib shoutcast; 
    private AudioManager mAudioManager; 
    AudioFocusHelper mAudioFocusHelper = null; 

    Handler handler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player); 

     mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 

     // create the Audio Focus Helper, if the Audio Focus feature is 
     // available (SDK 8 or above) 
     if (android.os.Build.VERSION.SDK_INT >= 8) { 
      mAudioFocusHelper = new AudioFocusHelper(getApplicationContext(), 
        this); 
     } 
     else { 
      mAudioFocus = AudioFocus.Focused; // no focus feature, so we always "have" audio focus 
     } 

     status = (TextView) findViewById(R.id.status); 

     artist = (TextView) findViewById(R.id.artist); 
     artist.setSelected(true); 

     track = (TextView) findViewById(R.id.track); 
     track.setSelected(true); 

     play = (Button) findViewById(R.id.play); 

     play.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View btn) { 
       if (!playState) { 
        play.setText("Pause"); 
        handler.postDelayed(handlePlayRequest, 300); 
       } 
       else { 
        play.setText("Play"); 
        status.setText("Press Play"); 
        handler.postDelayed(handlePlayRequest, 300); 
       } 
      } 

     }); 

     shoutcast = new AndroidShoutcastLib(); 

     try { 
      shoutcast.setShoutcastUrl(station); 
     } catch (InvalidStreamURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     shoutcast.setOnMetadataChangedListener(new MetadataListener(){ 

      @Override 
      public void OnMetadataChanged(Metadata item) { 
       artistName = item.artist; 
       trackName = item.track;    
       updateMeta(); 
      } 
     }); 

     setVolumeControlStream(AudioManager.STREAM_MUSIC);  
    } 

    public void onDestroy() { 
     super.onDestroy(); 

     shoutcast = null; 
     handler.removeCallbacks(handlePlayRequest); 
    } 

    public void updateMeta() { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       // This gets executed on the UI thread so it can safely modify Views 
       artist.setText(artistName); 
       track.setText(trackName); 
      } 
     }); 
    } 

    private final Runnable handlePlayRequest = new Runnable() { 
     public void run() { 
      if (playState) { 
       Log.d("Player", "Stop Called"); 
       giveUpAudioFocus(); 
       mPlayer.stop(); 
       mPlayer.reset(); 
       mPlayer.release(); 
       shoutcast.stopStream(); 
       mPlayer = null; 
       playState = false; 
      } 
      else { 
       Log.d("Player", "Play Called"); 
       createMediaPlayer(); 
       getAudioFocus(); 

       try { 
        mPlayer.setDataSource(shoutcast.startStream()); 
       } catch (IllegalArgumentException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (SecurityException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (MalformedURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (InvalidStreamURLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       mPlayer.prepareAsync(); 
      } 
     } 
    }; 

    private void createMediaPlayer() { 
     mPlayer = new MediaPlayer(); 

     // Make sure the media player will acquire a wake-lock while 
     // playing. If we don't do 
     // that, the CPU might go to sleep while the song is playing, 
     // causing playback to stop. 
     // 
     // Remember that to use this, we have to declare the 
     // android.permission.WAKE_LOCK 
     // permission in AndroidManifest.xml. 
     mPlayer.setWakeMode(getApplicationContext(), 
       PowerManager.PARTIAL_WAKE_LOCK); 

     // we want the media player to notify us when it's ready preparing, 
     // and when it's done 
     // playing: 
     mPlayer.setOnPreparedListener(this); 
     mPlayer.setOnCompletionListener(this); 
     mPlayer.setOnErrorListener(this); 
    } 

    private void startPlayer() { 
     mPlayer.setVolume(1.0f, 1.0f); 
     if (!mPlayer.isPlaying()) { 
      Log.d("Player", "Starting Playback"); 
      mPlayer.start(); 
      playState = true; 
      status.setText("Streaming"); 
     }    
    } 

    private void getAudioFocus() { 
     if (mAudioFocus != AudioFocus.Focused && mAudioFocusHelper != null 
       && mAudioFocusHelper.requestFocus()) 
      mAudioFocus = AudioFocus.Focused; 
    } 

    private void giveUpAudioFocus() { 
     if (mAudioFocus == AudioFocus.Focused && mAudioFocusHelper != null 
       && mAudioFocusHelper.abandonFocus()) 
      mAudioFocus = AudioFocus.NoFocusNoDuck; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_player, menu); 
     return true; 
    } 

    @Override 
    public void onBufferingUpdate(MediaPlayer arg0, int arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 
     playState = false; 
     handler.post(handlePlayRequest); 
     return false; 
    } 

    @Override 
    public void onPrepared(MediaPlayer arg0) { 
     startPlayer();  
    } 

    @Override 
    public void onCompletion(MediaPlayer arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onGainedAudioFocus() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onLostAudioFocus(boolean canDuck) { 
     // TODO Auto-generated method stub 

    } 

} 

Meine Forderung ist es, diese Aktivität zu Service-Klasse zu konvertieren, habe ich versucht, aber nicht immer, weil ich neu bin auch auf Android wie neu zu programmieren,

Könnte irgendjemand helfen?

+0

Aber für das, was Sie, dies konvertieren in Dienstklasse wollen RESON – Ramz

+0

ich die Musik in Hintergrund spielen wollen – String

Antwort

5

Wenn Sie nur Musik in Ihrer App müssen spielen, ist es in einem von Ihrer App gestartet Thread spielen/verwenden AsyncTask Klasse es für Sie zu tun.

Verwenden Sie diesen Code. Fügen Sie diese Klasse hinzu (in Ihrer Aktivitätsklasse eingeschlossen).

public class BackgroundSound extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     MediaPlayer player = MediaPlayer.create(YourActivity.this, R.raw.test_cbr); 
     player.setLooping(true); // Set looping 
     player.setVolume(100,100); 
     player.start(); 

     return null; 
    } 

} 

Auf der anderen Seite, wenn Sie einen Dienst nutzen möchten, dass Sie bei this page aussehen kann.

4

Nur wenige Schritte zu folgen .....

1.First den Servicebeispiele zu gehen.

2.Bei dieser Aktivität starten Sie einen Dienst, dh wenn diese App die Navigationsaktivität für den Service ----> Dienst geöffnet hat.

3.In Service Override onstart().

4.In onstart() erstellen musicplayer Funktion und Cal den gewünschten Song.

5. Und starten Sie so mp.play();

6.Now es auf den Hintergrund

+2

Erklärung ist gut, aber bitte hier Code –

3

Zunächst einmal ausgeführt wird, stellen Sie sicher, dass Sie verstehen, warum ein Service zu nutzen und nicht AsyncTask. This ist wirklich hilfreich für die gleichen und zeigt, warum Sie einen Dienst anstelle von AsyncTask verwenden sollten, um Musik im Hintergrund abzuspielen.

This wird sehr praktisch für Sie sein. Es zeigt deutlich, wie man einen Dienst verwendet, um Musik im Hintergrund abzuspielen.