2011-05-17 5 views
10

я добавил это мой файл манифеста -не в состоянии получить TelephonyManager.CALL_STATE_RINGING

 <receiver android:name=".ServiceReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 
</application> 

<uses-permission android:name="android.permission.READ_PHONE_STATE"> 
</uses-permission> 

Тогда мой класс службы, как это -

public class ServiceReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    MyPhoneStateListener phoneListener = new MyPhoneStateListener(); 
    TelephonyManager telephony = (TelephonyManager) context 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
} 

}

и мой PhoneStateListener является -

public class MyPhoneStateListener extends PhoneStateListener { 

public void onCallStateChanged(int state, String incomingNumber) { 
    Log.i("telephony-example", "State changed: " + stateName(state)); 
} 

String stateName(int state) { 
    switch (state) { 
    case TelephonyManager.CALL_STATE_IDLE: 
     Log.d("DEBUG", "***********IDLE********"); 
     return "Idle"; 
    case TelephonyManager.CALL_STATE_OFFHOOK: 
     Log.d("DEBUG", "***********OFFHOOK********"); 
     return "Off hook"; 
    case TelephonyManager.CALL_STATE_RINGING: 
     Log.d("DEBUG", "***********RINGING********"); 
     return "Ringing"; 
    } 
    return Integer.toString(state); 
} 

}

Я могу видеть состояние IDLE.

Но Когда я звоню, я не получаю состояние звонка. Зачем?

ответ

14

Я думаю, что вы смешиваете два подхода, чтобы получить состояние телефона. Если вы используете фильтр намерения и широковещательный приемник, то в приемнике не нужно вызывать прослушивание TelephonyManager(). Просто проверьте полученные намерения, как это:

public void onReceive(Context context, Intent intent) { 
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
    String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 
    if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) 
    { 
     Log.d("MPR", "Its Ringing [" + number + "]"); 
    } 
    if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) 
    { 
     Log.d("MPR", "Its Idle"); 
    } 
    if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) 
    { 
     Log.d("MPR", "Its OffHook"); 
    } 
} 
+0

Спасибо ... получил звонкий :) Кстати вы знаете, как сделать это приостановить мое приложение, когда звонит телефон, а затем вернуться в приложение, когда телефонный звонок кончено? – nasaa

+1

AFAIK, если ваше приложение запускает действие, его onPause и onStop будут вызваны, чтобы получить активность телефона спереди. Если вы используете службу, я не вижу причины, почему вы хотите приостановить работу, которую вы выполняете. Тем не менее, если вы хотите использовать описанный выше метод, чтобы знать, когда звонит телефон, а затем в зависимости от вашей логики приложения прекратите выполнение работы и возобновите работу позже, но я не понимаю, почему вы сделали бы это из службы! – advantej

+0

проблема в том, что у меня есть песня, но она не останавливается, когда звонит телефон, поэтому я спросил. – nasaa

Смежные вопросы