2016-08-09 1 views
1

медиаплеер останавливает музыку, когда нажата кнопка homebutton или экран выключается .... Я хочу, чтобы музыка продолжалась, даже если активность теряет фокус. ... но я хочу, чтобы музыка паузы для входящих вызовов, и если пользователь прерывает музыку .... и музыка должна остановиться, когда активность закрывается с помощью кнопки возвратаMedia Player останавливает музыку, когда активность теряет фокус (когда дома или экране отключается)

вот пример моего кода:

package com.example.acer.aartisangrah; 

import android.content.Context; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.text.Html; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SeekBar; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ekdanta extends AppCompatActivity implements Runnable, View.OnClickListener,SeekBar.OnSeekBarChangeListener { 
TextView tv4; 
Button b9, b10,but19; 
int count = 0; 
MediaPlayer play; 
SeekBar seek_bar; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_ekdanta); 
    tv4 = (TextView) findViewById(R.id.textView9); 
    tv4.setTextSize(18); 
    tv4.setText(Html.fromHtml(getString(R.string.thirteen))); 
    b9 = (Button) findViewById(R.id.b9); 
    b10 = (Button) findViewById(R.id.b10); 
    seek_bar = (SeekBar) findViewById(R.id.seekBar); 
    seek_bar.setOnSeekBarChangeListener(this); 
    seek_bar.setEnabled(false); 
    but19 = (Button) findViewById(R.id.button19); 
    but19.setOnClickListener(this); 
    TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    mTelephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
} 
private final PhoneStateListener mPhoneListener=new PhoneStateListener(){ 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 

     // Call receive state 
     if (state != TelephonyManager.CALL_STATE_IDLE) { 
      if ((play!= null) && (play.isPlaying())) 
      { 
       play.pause(); 
       but19.setBackgroundResource(R.drawable.play); 
      } 
     } 
    } 
}; 

public void run() { 
    int currentPosition = play.getCurrentPosition(); 
    final int total = play.getDuration(); 
    while (play != null && currentPosition < total) { 
     try { 
      Thread.sleep(1000); 
      currentPosition = play.getCurrentPosition(); 
     } catch (InterruptedException e) { 
      return; 
     } catch (Exception e) { 
      return; 
     } 
     seek_bar.setProgress(currentPosition); 
    } 
} 
public void onClick(View v) { 
    if (v.equals(but19)) { 
     if (play == null) { 
      play = MediaPlayer.create(getApplicationContext(), R.raw.ekadanta); 
      seek_bar.setEnabled(true); 
     } 
     if (play.isPlaying()) { 
      play.pause(); 
      but19.setBackgroundResource(R.drawable.play); 
     } else { 
      play.start(); 
      but19.setBackgroundResource(R.drawable.pause); 
      seek_bar.setMax(play.getDuration()); 
      new Thread(this).start(); 
     } 
    } 
    play.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      play.seekTo(0); 
      but19.setBackgroundResource(R.drawable.play); 
     } 
    }); 
} 

@Override 
protected void onPause() 
{ 
    super.onPause(); 
} 

@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    play.release(); 
} 

@Override 
public void onProgressChanged(SeekBar seek_bar, int progress, boolean fromUser) { 
    try{ 
     if(play.isPlaying()||play!=null){ 
      if (fromUser) 
       play.seekTo(progress); 
     } 
     else if(play==null){ 
      Toast.makeText(getApplicationContext(),"First Play", Toast.LENGTH_SHORT).show(); 
      seek_bar.setProgress(0); 
     } 
    } 
    catch(Exception e){ 
     Log.e("seek bar",""+e); 
     seek_bar.setEnabled(false); 
    } 
} 

@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 

} 

@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 

} 

public void increase(View inc) { 
    count++; 
    if (count == 1) { 
     tv4.setTextSize(22); 
    } else if (count == 2) { 
     tv4.setTextSize(30); 
    } else if (count >= 3) { 
     count = 3; 
     tv4.setTextSize(40); 
    } 
} 

public void decrease(View dec) { 
    count--; 
    if (count <= 0) { 
     tv4.setTextSize(18); 
     count = 0; 
    } 
    if (count == 1) { 
     tv4.setTextSize(22); 
    } else if (count == 2) { 
     tv4.setTextSize(30); 
    } else if (count == 3) { 
     tv4.setTextSize(40); 
    } 
} 
} 

EDIT

После использования этого кода для активности ... эта активность не открывается на некоторых устройствах ... приложение просто закрывается .... Пожалуйста, помогите !!! Другие виды деятельности без этого кода работают просто отлично ...

ответ

3

Чтобы остановить паузу музыки, когда приложение попадает на задний план. Комментарий play.pause(), как показано ниже:

@Override 
protected void onPause() 
{ 
    super.onPause(); 
    if ((play!= null) && (play.isPlaying())) 
    { 
     // play.pause(); 
    } 
} 

воспроизведение само должно остановить его на спине прессы (я почти уверен). Убедитесь, что вы удаляете медиаплеер в onDestroy().

Чтобы остановить его при получении вызова. Инстанцировать следующий приемник в вашей деятельности:

// Listens for phone state and pauses in an event of call 
    private final PhoneStateListener mPhoneListener = new PhoneStateListener() { 
     public void onCallStateChanged(int state, String incomingNumber) { 
      super.onCallStateChanged(state, incomingNumber); 

      // Call receive state 
      if (state != TelephonyManager.CALL_STATE_IDLE) { 
       if ((play!= null) && (play.isPlaying())) 
       { 
        play.pause(); 
       } 
      } 
     } 
    }; 

Вы должны зарегистрироваться для него, как (вероятно, в onCreate()):

// Make mTelephonyManager an instance variable 
TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
mTelephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 

Не забудьте отменить его в onDestroy():

mTelephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE); 
+0

Это работает так, как я хотел, но проблема в том, что музыка воспроизводится в фоновом режиме, и пользователь открывает приложение из запуска, которое приложение перезапускает, и при нажатии воспроизведения начинается воспроизведение новой музыки (эта проблема не возникает, если приложение открывается из последних приложений) – Devk

+0

@ Devk Хорошо .. музыка просто начинается с самого начала или музыка воспроизводит музыку, которая ранее воспроизводилась [вместе с ней]? – Shaishav

+0

Музыка играет поверх предыдущей пьесы – Devk

5

Прежде всего, у вас есть следующий код

@Override 
protected void onPause() 
{ 
    super.onPause(); 
    if ((play!= null) && (play.isPlaying())) 
    { 
     play.pause(); 
    } 
} 

Метод onPause выполняется каждый раз, когда действие переходит к фону (теряет фокус) или когда он закрыт пользователем. Таким образом, ваш первый шаг - удалить этот код из метода onPause, где вы намеренно звоните play.pause().

Вы должны переписать метод onBackPressed() и сделать что-то подобное тому, что вы делаете, но называть play.stop()

Проверьте here, в частности, на Выполнение очистки раздел, в котором говорится следующее

медиаплеер объект может потреблять значительную часть ресурсов системы , поэтому вы должны хранить его только столько, сколько вам нужно, и вызывать release(), когда вы закончите с ним. Важно, чтобы вызвать этот метод очистки явно, а не полагаться на системы мусора сбор, потому что это может занять некоторое время, прежде чем сборщик мусора исправляет MediaPlayer

Убедитесь, что смотреть на этой направляющей, а также.

+0

Эй, я думал, что как только 'super.onBackPressed()' называется 'finish()' будет следовать вскоре после. Таким образом, экземпляр mediaPlayer также будет уничтожен (мусор собирается в конечном итоге, пока его ссылка не удерживается никаким другим внешним классом). Поэтому мне не нужно останавливать его в 'onBackPressed()'. – Shaishav

+0

Да, вы правы, в конечном итоге это будет сбор мусора, но рекомендуется, как хорошая практика, освободить медиаплеера, когда вы точно это сделаете, используя его. Проверьте мой обновленный ответ :) –

+0

Да. Я обычно поместил этот код очистки, по крайней мере, в 'onDestroy()', если не в 'onPause()' (зависит от варианта использования):) ... – Shaishav