Как определить входящий звонок с помощью Broadcast Receiver?

Я пытаюсь распознать входящие вызовы через широковещательный приемник. Я НЕ МОГУ так сделать! На самом деле, я не могу «запустить» трансляцию!

Вот мой код:

activate.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                Toast.makeText(getApplicationContext(),"Clicked",1).show();
                final String BROADCAST_ACTION_NAME = ".BroadcastMM";
                Intent intent = new Intent();  
                intent.setAction(BROADCAST_ACTION_NAME);        
                sendBroadcast(intent); 


            }                                           
            }

Я не знаю, сработает ли когда-нибудь этот 'sendBroadcast'! В моем файле широковещательного приемника:

public void onReceive(Context context, Intent intent)
    {
        if(intent.getAction()=="android.intent.action.PHONE_STATE"){
        Toast.makeText(c,"BroadCast fired!",1).show();}
        Bundle extras = intent.getExtras();
        String state = extras.getString(TelephonyManager.EXTRA_STATE);
        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
            Toast.makeText(context, "Ringing", 1).show();
        }
}       

Мой файл манифеста:

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

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

Есть ли какая-то логика, которую я упускаю? Я очень новичок в Android, поэтому, пожалуйста, помогите мне.


person Saturnian    schedule 06.03.2013    source источник


Ответы (1)


intent.getAction()=="android.intent.action.PHONE_STATE"

должно быть

TelephonyManager.ACTION_PHONE_STATE_CHANGED.equals(intent.getAction());

Так как именно так вы сравниваете строки (с equals()).

Кроме того, код, который вы используете для трансляции, никогда не должен транслироваться — здесь нет действия ".BroadcastMM". Вместо этого попробуйте сделать явное:

 Intent intent = new Intent(v.getContext(),BroadcastMM.class);  
 sendBroadcast(intent);

Также вероятно, что вы не можете транслировать android.intent.action.PHONE_STATE, поэтому ваше if не будет выполнено, если вы сделаете явное намерение.

Если вы действительно хотите проверить, работает ли ваш BroadcastReceiver, поместите распечатки/тосты вне всех ifs. Затем, как только вы убедитесь, что BroadcastReceiver отвечает, выполните проверку. Имейте в виду, однако, что, поскольку вы прослушиваете только один Intent-Filter, проверка if, является ли Intent PHONE_STATE Intent, немного избыточна.

person A--C    schedule 06.03.2013