0

전화가 걸렸을 때 자동으로 SMS를 보내는 앱이 있지만 전화 발신 SMS가 시작되어 통화 거부 때까지 여러 번 계속되는 앱이있어서 잘못되었습니다. 각 호출마다 한 번만 보냅니다. 여기에 내 코드 나거부 ​​전화 때까지 서비스가 계속 잘못 수신 됨

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 메서드의 상태를 바꾸는 것 뿐이며 내 서비스의 정적 부울 변수를 정의한 다음, 링이 울리는 상태에서 sms를 보내는 스위치를 제어하고 그 후에 sms 메서드를 호출하지 못하도록이 변수를 false로 설정합니다. 유휴 상태에서 true로 설정하여 나중에 호출 할 수있는 권한을 얻습니다. 여기 내가 한 일이 있습니다 :

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; 

       }