0

我有一個應用程序,當發生呼叫時自動發送短信,但是當一個通話發送短信開始並繼續多次直到呼叫拒絕,這是錯誤的,我想每次打電話只發一次。這裏是我的代碼,請幫我在廣播接收器發送短信,而服務繼續錯誤地繼續拒絕通話

SmsService.java

public class SmsService extends Service { 

public static 
BroadcastReceiver mReceiver; 

public static class ServiceReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 

     TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
     telephony.listen(new PhoneStateListener(){ 
      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       super.onCallStateChanged(state, incomingNumber); 
       // System.out.println("incomingNumber : "+incomingNumber); 
       TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
       telephony.listen(new PhoneStateListener(){ 
        @Override 
        public void onCallStateChanged(int state, String incomingNumber) { 
         super.onCallStateChanged(state, incomingNumber); 
         Log.d("callingggggggg","oopsssss"); 


         sendSMS(incomingNumber,"hello",context); 
        } 
       },PhoneStateListener.LISTEN_CALL_STATE); 
      } 
     },PhoneStateListener.LISTEN_CALL_STATE); 

    } 
} 

SendSMS.java

private void sendSMS(String phoneNumber, String message, Context c) { 
     try { 
      SmsManager sms = SmsManager.getDefault(); 
      sms.sendTextMessage(phoneNumber,null,message,null,null); 
      Toast.makeText(c, "SMS sent.", 
        Toast.LENGTH_LONG).show(); 

     } catch (Exception e) { 

      e.printStackTrace(); 
      Toast.makeText(c, "SMS sending failed...",Toast.LENGTH_SHORT).show(); 
     } 

    } 

} 

注:我第一次做註冊和註銷我在的onCreate和接收器的onDestroy在我服務類,但之後,將其更改爲onResume和onPause在我的主要活動中,沒有一個沒有不同。

的onResume和中的onPause主要活動

@Override 
protected void onResume() { 
    super.onResume(); 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction("action"); 
    filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
    mReceiver = new SmsService.ServiceReceiver(); 
    registerReceiver(mReceiver, filter); 

    } 

@Override 
protected void onPause() { 
    super.onPause(); 

    unregisterReceiver(mReceiver); 

} 

的Manifest.xml

<service 
     android:enabled="true" 
     android:name=".SmsService" 
     android:label="SmsService" > 
    </service> 

<receiver android:name="com.example.mohammad.testsms.SmsService$ServiceReceiver" > 
     <intent-filter > 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     </intent-filter> 
    </receiver> 

回答

1

因爲你聽那麼多的狀態變化的行動。也許你只能聽一個動作。 你可以

telephony.listen(new PhoneStateListener(){ 
       @Override 
       public void onCallStateChanged(int state, String incomingNumber) { 
        super.onCallStateChanged(state, incomingNumber); 
        Log.d("callingggggggg","state:"+state);// here!!!!!!! 


        sendSMS(incomingNumber,"hello",context); 
       } 
      },PhoneStateListener.LISTEN_CALL_STATE); 

並得到哪個狀態只出現一次。並切換該狀態。 希望可以幫到你。

+0

https://developer.android.com/reference/android/telephony/TelephonyManager.html你可以從這個網站獲得狀態信息。 –

+0

我這樣做,但沒有區別 – hdiz

0

我最終通過@ ihsan.gaozp來解決我的問題,他的寫作幫助指導我解決問題。我所做的是切換狀態的onCallstateChange方法,除此之外,我在我的服務中定義靜態布爾變量,然後控制大小寫振鈴狀態開關的情況下,然後將此變量設置爲false,以防止再次調用sms方法在空閒狀態下設置爲真以獲得稍後調用的許可。這裏是我所做的:

public static boolean stateCall = true ; 

@Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       super.onCallStateChanged(state, incomingNumber); 

       switch (state) { 
        case TelephonyManager.CALL_STATE_RINGING: 
         if(stateCall){ 
          Log.d("callingggggggg",state + ""); 
          sendSms(); 
          stateCall = false ; 
         } 

         break ; 
        case TelephonyManager.CALL_STATE_IDLE: 
         stateCall = true; 
         Log.d("DEBUG", "***********IDLE********"); 
         break; 

       } 
相關問題