2016-09-26 36 views
0

我想实现在后台和前台获取来电事件。所以我为此创建了BroadcastReceiver,但onReceive()方法在获取/获取/完成传入呼叫后未触发。 我tryed吨教程,但没有任何帮助我:(无法获得来电事件

请帮助。

清单

<?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是正确的,你必须注册接收器 –

+0

@SripadRaj我已经注册到Manifest.xml中?这不够吗? –

回答

1

您错过了在您的活动中致电registerReciever(intent,intentFilter)。在onResume()注册您的活动,并在onPause()方法中致电unregisterReciever(intent)

注:

还要检查,如果你在你的清单都给予适当的权限,也请注意,即使你已经宣布你所需的权限,你必须处理在的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 InvalidCall(); registerReceiver(receiver,intentFilter);但onReceive()仍然没有被触发。 –

+0

Tryed that不h ELP :( –

0

1)确保您的应用有权限READ_PHONE_STATE

2)你不需要registerReceiver(广播接收器,IntentFilter的),因为你拥有它你的清单

3)确保通知是开启您的应用程序(检查设置 - >应用程序管理器 - >你的应用程序 - >通知)

4)我会尝试测试,而在switch语句

5)尽量使用Toast“破发”而不是L OG。 Toast.makeText(Context,String,Toast.LENGTH_SHORT).show();