2016-09-26 2 views
0

Я хочу реализовать входящие вызовы в фоновом режиме и на переднем плане. Поэтому я создал BroadcastReceiver для этой цели, но метод onReceive() не запускается после того, как я получил/получил/завершил входящий вызов. я судимое тонн учебника, но ничего не помогло мне :(Не удается получить входящий звонок

Пожалуйста, помогите.

MANIFEST

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="yakiv.bondar.dev.incomeoutcomecalltest"> 

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

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver 
     android:name=".IncomingCall" 
     android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 
</application> 

радиовещательный приемник

public class IncomingCall extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d("tag", "AAAAAAAAAAAAAAAAAAAAAA"); 
    MyPhoneStateListener phoneListener=new MyPhoneStateListener(); 
    TelephonyManager telephony = (TelephonyManager) 
      context.getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
} 

public class MyPhoneStateListener extends PhoneStateListener { 
    public void onCallStateChanged(int state,String incomingNumber){ 
     switch(state){ 
      case TelephonyManager.CALL_STATE_IDLE: 
       Log.d("tag", "IDLE"); 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       Log.d("tag", "OFFHOOK"); 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 
       Log.d("tag", "RINGING"); 
       break; 
     } 
    } 
} 
} 

Основная деятельность

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 
+0

Вы должны зарегистрировать свой ресивер в своей деятельности. – SripadRaj

+0

sripad is right, вам необходимо зарегистрировать ресивер –

+0

@SripadRaj Я зарегистрировал его в Manifest.xml? Этого недостаточно? –

ответ

1

Вы пропустили вызов registerReciever(intent,intentFilter) в своей деятельности. Зарегистрируйте свою деятельность в onResume() и позвоните по номеру unregisterReciever(intent) в свой метод onPause().

Примечание:

Также убедитесь, что вы предоставили соответствующие разрешения в манифесте, а также отметить, что даже если вы объявили свои необходимые разрешения, которые вы должны обрабатывать определенные разрешения на выполнения в Android 6.0 и выше , Проверьте here на обработку разрешений во время выполнения для Marshmallow и выше.

0

В MainActivity:

IncomingCall mBroadcastReceiver = new IncomingCall(); 

В onResume:

IntentFilter filter = new IntentFilter(); 
    this.registerReceiver(mBroadcastReceiver , filter); 

В OnPause:

this.unregisterReceiver(mBroadcastReceiver); 
+0

Я добавил: String BROADCAST = "android.intent.action.PHONE_STATE"; IntentFilter intentFilter = новый IntentFilter (BROADCAST); Приемник IncomingCall = новый IncomingCall(); registerReceiver (receiver, intentFilter), но onReceive() все еще не уволен. –

+0

Пробовал, что . Не h очь :( –

0

1) Убедитесь, что приложение имеет разрешения на READ_PHONE_STATE

2) Вам не нужно registerReceiver (BroadcastReceiver, IntentFilter), так как вы имеете его в манифесте

3) Убедитесь, что уведомление являются включен для вашего приложения (Check Settings -> Диспетчер приложений -> приложение -> Уведомления)

4) Я бы попробовать тестирование без «перерыв» в заявлениях переключателя

5) пытаются с Тост вместо L ог. Toast.makeText (Контекст, String, Toast.LENGTH_SHORT) .show();