【问题标题】:Want MediaPlayer to continue running when screen is locked希望 MediaPlayer 在屏幕锁定时继续运行
【发布时间】:2014-02-13 13:47:09
【问题描述】:

我怎样才能让我的 MediaPlayer 即使在手机被锁定并且屏幕关闭时也能继续播放,我认为它可能需要做一些事情来使其成为一项服务,但不确定。如果是这样,我该如何将其更改为服务,或者是否有更快更简单的解决方法?

任何帮助都会很棒!

代码如下:

 public class player2 extends Activity implements Runnable {


private  MediaPlayer mp;
private ProgressBar progressBar;
private ImageButton pauseicon;
private final int NUM_SOUND_FILES = 3;  //*****REPLACE THIS WITH THE ACTUAL NUMBER OF SOUND FILES YOU HAVE*****
private int mfile[] = new int[NUM_SOUND_FILES];
private Random rnd = new Random();


   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player_2);
        pauseicon = (ImageButton) findViewById(R.id.pauseicon);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        getActionBar().setDisplayHomeAsUpEnabled(true);



        mfile[0] = R.raw.sound04;  //****REPLACE THESE WITH THE PROPER NAMES OF YOUR SOUND FILES
        mfile[1] = R.raw.sound05;  //PLACE THE SOUND FILES IN THE /res/raw/ FOLDER IN YOUR PROJECT*****
        mfile[2] = R.raw.sound06;
        // Listeners
        /**
         * Play button click event
         * plays a song and changes button to pause image
         * pauses a song and changes button to play image
         * */


        try{
             mp = MediaPlayer.create(player2.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
             mp.seekTo(0);
             mp.start(); ;         
             progressBar.setVisibility(ProgressBar.VISIBLE);
             progressBar.setProgress(0);
             progressBar.setMax(mp.getDuration());
             new Thread(this).start();

         } catch (IllegalArgumentException e) {
             e.printStackTrace();
         } catch (IllegalStateException e) {
             e.printStackTrace();
         }

        mp.setOnCompletionListener(new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                pauseicon.setImageResource(R.drawable.playicon);
            }
        });

        pauseicon.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                 // No need to check if it is pauseicon

        if(mp.isPlaying()){
            mp.pause();
         ((ImageButton) v).setImageResource(R.drawable.playicon);

        } else {
            mp.start();
            ((ImageButton) v).setImageResource(R.drawable.pauseicon);
     }}});

   }
   static boolean runThread = true;
   public void run() {
        while ( runThread )  {
              int currentPosition=0;
              int total = mp.getDuration();
              if ( mp != null && currentPosition <= total )  {
              try {
                 Thread.sleep(1000);
                 currentPosition= mp.getCurrentPosition();
              } catch (InterruptedException e) {
                 return;
              } catch (Exception e) {
                 return;
              }            
              progressBar.setProgress(currentPosition);
           } else
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
        runThread = false; 
    }
   @Override
   protected void onStop() {
       super.onStop();
       if (mp != null && mp.isPlaying()){
           mp.pause();

       }
   }

   @Override
   public void onResume()
   {
   super.onResume();

   if (mp != null){
         if(!mp.isPlaying())
            try {
                mp.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             mp.start();

     }
   } 


   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);

            return true;
        default:
            return super.onOptionsItemSelected(item);

    }

       }

    }

【问题讨论】:

    标签: android media-player android-mediaplayer


    【解决方案1】:

    按照下面的教程...在下面的教程中,我将 .mp3 文件存储在 raw 文件夹中。如果您已将其存储在 sd 卡中并动态获取该文件,然后将其路径放入 bundle 中并通过您可以在服务的 onStartCommand() 方法中获取的意图发送它。

    MainActivity.java

    public class MainActivity extends Activity implements OnClickListener {
    
      Button startPlaybackButton, stopPlaybackButton;
      Intent playbackServiceIntent;
    
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        startPlaybackButton = (Button) this.findViewById(R.id.StartPlaybackButton);
        stopPlaybackButton = (Button) this.findViewById(R.id.StopPlaybackButton);
    
        startPlaybackButton.setOnClickListener(this);
        stopPlaybackButton.setOnClickListener(this);
    
        playbackServiceIntent = new Intent(this, BackgroundAudioService.class);
      }
    
      public void onClick(View v) {
        if (v == startPlaybackButton) {
          startService(playbackServiceIntent);
          finish();
        } else if (v == stopPlaybackButton) {
          stopService(playbackServiceIntent);
          finish();
        }
      }
    }
    

    BackgroundAudioService.java

    public class BackgroundAudioService extends Service implements OnCompletionListener {
          MediaPlayer mediaPlayer;
    
          @Override
          public IBinder onBind(Intent intent) {
            return null;
          }
    
          @Override
          public void onCreate() {
              mediaPlayer = MediaPlayer.create(this, R.raw.abc);// YOUR FILE NAME
              mediaPlayer.setOnCompletionListener(this);
              Log.v("TEST", "1");
          }
    
          @Override
          public int onStartCommand(Intent intent, int flags, int startId) {
    
             if (!mediaPlayer.isPlaying()) {
                 Log.v("TEST", "2");
              mediaPlayer.start();
            }
            return START_STICKY;
          }
    
          public void onDestroy() {
            if (mediaPlayer.isPlaying()) {
              mediaPlayer.stop();
            }
            mediaPlayer.release();
          }
    
          public void onCompletion(MediaPlayer _mediaPlayer) {
            stopSelf();
          }
    
        }
    

    activity_main.xml

        <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <TextView  
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:text="Background Audio Player"
            />
       <Button android:text="Start Playback" android:id="@+id/StartPlaybackButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
       <Button android:text="Stop Playback" android:id="@+id/StopPlaybackButton" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    </LinearLayout>
    

    不要忘记在 manifest.xml 中声明 Service,如下所示,

    <service android:name="com.demo.tute.BackgroundAudioService" />
    

    【讨论】:

    • 谢谢你,但随机音频选择器和进度条会发生什么?
    • 所以你需要在完成一个后随机选择音频对吗?如果是这样,这很简单只需创建所有音频文件名或 id 的 Arraylist 并使用 Collection.shuffle() 方法对它们进行混洗,并在上述服务的 onCompletion() 方法中启动其他音频。
    • 你能具体说说进度条的场景吗??
    • 好吧,我的代码可以在 atm 工作,它会随机选择一个音频并播放它并显示一个进度条,这很有效。问题是我只是想要它,所以当我按下手机上的锁时它会继续播放。
    • 如何在 onStartCommand() 中传递意图,因为我正在从 SD 卡播放文件。请帮帮我。 @墨尔本洛佩斯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多