2014-02-23 145 views
1

我一直試圖讓我的應用程序停止播放音樂,當電話響起時,但它不工作。我已經嘗試了一切,但似乎不可能。這是代碼。如何在來電時阻止音樂?

package com.beanie.samples.streaming; 

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

import com.beanie.samples.streaming.R; 
import com.beanie.samples.streaming.MyService; 

import android.app.Activity; 
import android.app.IntentService; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnBufferingUpdateListener; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.os.HandlerThread; 
import android.os.IBinder; 
import android.os.Looper; 
import android.os.Message; 
import android.telephony.PhoneStateListener; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ProgressBar; 
import android.widget.Toast; 

public class HomeActivity extends Activity implements OnClickListener { 

    private static final String TAG = "MyServices"; 

    private final static String RADIO_STATION_URL = "http://195.154.237.162:8936/"; 

    private static final String START_STICKY = null; 
    Button buttonPlay, buttonStopPlay; 

    /** Called when the activity is first created. 
    * Keep this here all the application will stop working */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     initializeUIElements(); 

     initializeMediaPlayer(); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     buttonPlay = (Button) findViewById(R.id.buttonPlay); 
     buttonStopPlay = (Button) findViewById(R.id.buttonStopPlay); 

     buttonPlay.setOnClickListener(this); 
     buttonStopPlay.setOnClickListener(this); 
    } 

    private ProgressBar playSeekBar; 

    private MediaPlayer player; 

    private InputStream recordingStream; 

    private RecorderThread recorderThread; 

    private boolean isRecording = false; 

    private void initializeUIElements() { 

     playSeekBar = (ProgressBar) findViewById(R.id.progressBar1); 
     playSeekBar.setMax(100); 
     playSeekBar.setVisibility(View.INVISIBLE); 

     buttonPlay = (Button) findViewById(R.id.buttonPlay); 
     buttonPlay.setOnClickListener(this); 

     buttonStopPlay = (Button) findViewById(R.id.buttonStopPlay); 
     buttonStopPlay.setEnabled(false); 
     buttonStopPlay.setOnClickListener(this); 
    } 

    public void startPlaying() { 
     buttonStopPlay.setEnabled(true); 
     buttonPlay.setEnabled(false); 

     playSeekBar.setVisibility(View.VISIBLE); 

     player.prepareAsync(); 

     player.setOnPreparedListener(new OnPreparedListener() { 

      public void onPrepared(MediaPlayer mp) { 
       player.start(); 
      } 
     }); 
    } 

    private void onBufferingUpdate(MediaPlayer mp, int percent) { 
     playSeekBar.setSecondaryProgress(percent); 
     Toast.makeText(this, "Buffering ", percent).show(); 

     Log.i("Buffering", "" + percent); 
    } 

    public class GetCallerInfoActivity extends Activity { 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);  
      // register PhoneStateListener 
      PhoneStateListener callStateListener = new PhoneStateListener() { 

       public void onCallStateChanged(int state, String incomingNumber) { 

        // If phone ringing 
        if (state==TelephonyManager.CALL_STATE_RINGING) { 
         stopPlaying();           
        } 

        // If incoming call received 
        if (state==TelephonyManager.CALL_STATE_OFFHOOK) { 
         stopPlaying(); 
        } 


        if (state==TelephonyManager.CALL_STATE_IDLE) { 
         Toast.makeText(getApplicationContext(),"phone is neither ringing nor in a call", Toast.LENGTH_LONG).show(); 
        } 
       } 
      }; 

      telephonyManager.listen(callStateListener,PhoneStateListener.LISTEN_CALL_STATE); 
     } 
    } 

    public void onClick(View v) { 
     if (v == buttonPlay) { 
      startPlaying(); 
      player.setLooping(false); // Set looping 
     } else if (v == buttonStopPlay) { 

      Log.d(TAG, "onClick: stopping srvice"); 
      stopPlaying(); 
     } 
    } 

    private void stopPlaying() { 
     if (player.isPlaying()) { 
      player.stop(); 
      player.release(); 
      initializeMediaPlayer(); 
     } 

     buttonPlay.setEnabled(true); 
     buttonStopPlay.setEnabled(false); 
     playSeekBar.setVisibility(View.INVISIBLE); 

     stopRecording(); 
    } 

    private void initializeMediaPlayer() { 
     player = new MediaPlayer(); 
     try { 
      player.setDataSource(RADIO_STATION_URL); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void startRecording() { 

     BufferedOutputStream writer = null; 
     try { 
      URL url = new URL(RADIO_STATION_URL); 
      URLConnection connection = url.openConnection(); 
      final String FOLDER_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() 
        + File.separator + "Songs"; 

      File folder = new File(FOLDER_PATH); 
      if (!folder.exists()) { 
       folder.mkdir(); 
      } 

      writer = new BufferedOutputStream(new FileOutputStream(new File(FOLDER_PATH 
        + File.separator + "sample.mp3"))); 
      recordingStream = connection.getInputStream(); 

      final int BUFFER_SIZE = 100; 

      byte[] buffer = new byte[BUFFER_SIZE]; 

      while (recordingStream.read(buffer, 0, BUFFER_SIZE) != -1 && isRecording) { 
       writer.write(buffer, 0, BUFFER_SIZE); 
       writer.flush(); 
      } 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       recordingStream.close(); 
       writer.flush(); 
       writer.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private void stopRecording() { 

     try { 
      isRecording = false; 
      if (recordingStream != null) { 
       recordingStream.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private class RecorderThread extends Thread { 
     @Override 
     public void run() { 
      isRecording = true; 
      startRecording(); 
     } 

    }; 
} 

請問有人可以幫忙實施嗎?我會很感激,它會有很大的幫助。另外,我甚至通過嘗試幫助自己。

回答

5

您需要使用TelephonyManager

mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
mTelephonyMgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 

的偵聽器對象可以像這樣

private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     // Test for incoming call, dialing call, active or on hold 
     if (state==TelephonyManager.CALL_STATE_RINGING || state==TelephonyManager.CALL_STATE_OFFHOOK) 
     { 
      stop(); // Put here the code to stop your music 
     } 
     super.onCallStateChanged(state, incomingNumber); 
    } 
}; 

創建當停止,或關閉您的應用程序,記得打電話這一點。

mTelephonyMgr.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 
+0

ok謝謝;) 我設法讓它工作!忘了在onClick中調用它將添加到OnCreate而不是 – user279297

+0

@ user279297不客氣。我會很感激,如果你upvote答案或標記答案被接受。 – Merlevede

+1

我不能投票,因爲我沒有足夠的聲譽,但我接受;) – user279297