2013-07-20 46 views
1

我已經使用了此答案中提供的解決方案Stopping & Starting music on incoming calls,但無法弄清楚如何在我的代碼中實現它。這是我做過什麼 -Android:在電話呼叫期間停止Widget的MediaPlayer活動

public class KameWidget extends AppWidgetProvider { 
public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget"; 
MediaPlayer mPlay; 
Context mContext; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
      R.layout.main); 

    Intent active = new Intent(context, KameWidget.class); 
    active.setAction(ACTION_WIDGET_RECEIVER); 
    PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 
      0, active, 0); 
    remoteViews.setOnClickPendingIntent(R.id.IBWidget, actionPendingIntent); 
    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 

    final String action = intent.getAction(); 
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { 
     final int appWidgetId = intent.getExtras().getInt(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 
     if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { 
      this.onDeleted(context, new int[] { appWidgetId }); 
     } 
    } else { 
     if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) { 

      mPlay = MediaPlayer.create(context, R.raw.kamehameha); 
      mPlay.start(); 
      PhoneStateListener phoneStateListener = new PhoneStateListener() { 
       @Override 
       public void onCallStateChanged(int state, 
         String incomingNumber) { 
        if (state == TelephonyManager.CALL_STATE_RINGING 
          || state == TelephonyManager.CALL_STATE_OFFHOOK) { 
         mPlay.stop(); 
        } 
        super.onCallStateChanged(state, incomingNumber); 
       } 
      }; 
      TelephonyManager mgr = (TelephonyManager) mContext 
        .getSystemService(Context.TELEPHONY_SERVICE); 
      if (mgr != null) { 
       mgr.listen(phoneStateListener, 
         PhoneStateListener.LISTEN_CALL_STATE); 
      } 
     } else { 
     } 
     super.onReceive(context, intent); 
    } 
    } 
} 

回答

0

這裏是我的理解:

  • 你寫了一個媒體播放器應用插件
  • 用戶按下一個按鈕,使其開始播放(東西)
  • 呼叫進來=>聲音暫停

以下是我將如何繼續下去:

  1. 您將播放音軌的服務(android.app.Service)綁定到小部件上的按鈕。
  2. 該服務啓動實際的MediaPlayer任務。
  3. 當呼叫進入時,任務會暫停MediaPlayer。
  4. 當通話結束時,任務可能(取決於您想要的)恢復MediaPlayer。

1)內部KameWidget.onUpdate(..),是這樣的:

Intent intentPlay = new Intent(context, YourPlaySoundService.class); 
PendingIntent piPlay = PendingIntent.getService(context, 0, intentPlay, PendingIntent.FLAG_UPDATE_CURRENT); 
RemoteViews views = new RemoteViews(context.getPackageName(), layoutId); 
views.setOnClickPendingIntent(R.id.play, piPlay); 
... 

2)服務:

public class YourPlaySoundService extends Service { 
    ... 
    public int onStartCommand (Intent intent, int flags, int startId) { 
    // Start the Audio Task 
    // Instantiate AudioTask 
    AudioTask task = new AudioTask(); 
    // E.g. get your resource ID from the widget: 
    Bundle extras = intent.getExtras(); 
    int resId = extras.getInt(YOUR_RESOURCE_PARAM_KEY); 
    task.execute(resId); 

    return super.onStartCommand(intent, flags, startId); 
    } 
} 

3)音頻任務:

public class AudioTask extends AsyncTask<Integer, Void, Void> { 
    private MediaPlayer mMediaPlayer; 
    // Telephony-Stuff 

    public void resume() { 
    if(/* check on correct media player state */) { 
     mMediaPlayer.start(); 
    } 
    } 
    public void pause() { 
    if(mMediaPlayer.isPlaying()) { 
     mMediaPlayer.pause(); 
    } 
    } 
    public void stop() { 
    if(mMediaPlayer.isPlaying()) { 
     mMediaPlayer.stop(); 
    } 
    mMediaPlayer.release(); 
    mMediaPlayer = null; 
    } 

    protected Void doInBackground(Integer ... params) { 
    int resId = params[0]; 
    // get the resources from a context (the service) 
    AssetFileDescriptor afd = mResources.openRawResourceFd(resId); 
    try { 
     mMediaPlayer.reset(); 
     mMediaPlayer.setDataSource(
      afd.getFileDescriptor(), 
      afd.getStartOffset(), 
      afd.getDeclaredLength() 
     ); 
     mMediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      mp.seekTo(0); 
      mp.start(); 
     } 
     }); 
     mMediaPlayer.prepare(); 
     afd.close(); 
    } 
    catch (Exception e) { 
     Log.e("TAG", e.getMessage(), e); 
    } 
    return null; 
    } 

    // Copied from your link: http://stackoverflow.com/a/5610996/747906 
    PhoneStateListener phoneStateListener = new PhoneStateListener() { 
    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     if (state == TelephonyManager.CALL_STATE_RINGING) { 
      mMediaPlayer.pause(); 
     } else if(state == TelephonyManager.CALL_STATE_IDLE) { 
      //Not in call: Play music 
     } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) { 
      //A call is dialing, active or on hold 
     } 
     super.onCallStateChanged(state, incomingNumber); 
    } 
    }; 
} 

我真的不知道電話的東西是如何工作的。你必須自己弄明白。

這是我的想法。我希望它有幫助。

+0

感謝您的幫助。不幸的是,我無法在我的代碼中實現這一點。 TelephonyManager類顯示錯誤,我也不知道如何處理OnRecieve()以及如何使用OnStartCommand()。 :( – AhulR

+0

afaik,你不需要onReceive()。在電話狀態監聽器中,你只需簡單地調用audioTask.pause()或audioTask.resume()。 –