2017-10-19 142 views
0

我有此代碼,我的應用程序未檢測到來電。廣播接收器未觸發來電

我的代碼與這個答案非常相似我做錯了什麼?

How does a Android "OS" detect a incoming call

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

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     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> 

     <service 
      android:name="com.reporting2you.services.FloatingViewService" 
      android:enabled="true" 
      android:exported="false" /> 

     <activity android:name=".FloatingActivity" /> 

     <receiver 
      android:name="com.reporting2you.broadcastReceiver.CallReceiver" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

廣播接收器

public class CallReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      String state = extras.getString(TelephonyManager.EXTRA_STATE); 
      Log.w("MY_DEBUG_TAG", state); 
      if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
       context.startActivity(new Intent(context, FloatingActivity.class)); 
       ((MainActivity)context).finish(); 
       String phoneNumber = extras 
         .getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
       Log.w("MY_DEBUG_TAG", phoneNumber); 
      } 
     } 

    } 
} 
+0

@GeniusQ謝謝你我現在的問題是在這裏:((MainActivity)上下文).finish();我無法投射,所以我怎樣才能終止我的活動? –

+0

您是否嘗試調試應用程序來檢查上下文是否是instanceof Activity? – nhoxbypass

+0

不,我只是應該有一次,我只留下mainActivity在接通電話。 –

回答

0

如果使用android.intent.action.PHONE_STATE你需要先申請READ_PHONE_STATE許可。 因爲android.permission.READ_PHONE_STATE是危險等級許可,所以你必須在運行時間checkSelfPermission()

如果不是在Android版本高於Marshmallow(23)的設備上運行,則不會觸發廣播。

參見:Requesting Permissions at Run Time

+0

問題是廣播沒有觸發 –

+0

@AbdulWaheed你是什麼意思?如果他使用'android.intent.action.PHONE_STATE',他需要請求READ_PHONE_STATE。如果不是,廣播將不會被觸發。 我錯了嗎? – nhoxbypass

+0

如果他的目標是棉花糖,該怎麼辦?問題是廣播沒有被觸發。找到原因爲什麼 –

0

嘗試

public class CallReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); //Change Here 
      Log.w("MY_DEBUG_TAG", state); 
      if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
       context.startActivity(new Intent(context, FloatingActivity.class)); 
       ((MainActivity)context).finish(); 
       String phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); //Change Here 
       Log.w("MY_DEBUG_TAG", phoneNumber); 
      } 
     } 

    } 
} 
+0

是不是intent.getExtras()。getString()等於intent.getStringExtra()? –