web-dev-qa-db-ja.com

Androidバックグラウンドで音楽を再生する

以下のような私の活動コードがあります:

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

    }

}

私の要件は、このアクティビティをサービスクラスに変換することです。私は試しましたが、取得していません。Androidとプログラミングが初めてなので、

誰か助けてもらえますか?

12
String

アプリで音楽を再生する必要があるだけの場合は、アプリ/ useAsyncTaskクラスから起動したスレッドで音楽を再生してください。

このコードを使用します。このクラスを追加します(アクティビティクラスで囲まれています)。

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;
    }

}

一方、サービスを利用したい場合は このページ を参照してください。

6
Castiblanco

実行するいくつかの手順.....

1.まずサービス例を確認します。

2.このアクティビティからサービスを開始します。つまり、このアプリを開いたときにアクティビティをナビゲートして、アクティビティにサービスを提供します--->サービス。

3.インサービスのonstart()オーバーライド。

4. onstart()でmusicplayer関数を作成し、必要な曲を作成します。

5.そして、このmp.play();のように開始します。

6.バックグラウンドで実行されます

4
Ramz

まず、サービスを使用する理由と、AsyncTaskをしない理由を理解していることを確認してください。 これ は、同じ場合に非常に役立ち、AsyncTaskではなくサービスを使用してバックグラウンドで音楽を再生する必要がある理由を示します。

これ は非常に便利です。これは、サービスを使用してバックグラウンドで音楽を再生する方法を明確に示しています。

3
Shubham A.