2016-04-22 10 views
1

次のコードは、着信発信番号にテキストを送信しますが、毎回異なる量のテキストを送信します。時には1つだけを送信することもありますが、最大6まで変化します。機能している間に自分のコードを監視するとき、私は異なる数のブロードキャストも取得します。私は間違って何をしていますか?複数のテキストを送信するブロードキャスト受信機を使用したAndroidの自動テキスト返信。

受信機:

package com.biapps.makin_biscuits; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.PhoneStateListener; 
import android.telephony.SmsManager; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.Toast; 

/** 
* Created by Jake on 3/21/2016. 
*/ 

public class IncomingCallReceiver extends BroadcastReceiver { 

private static final String TAG = "MyListener"; 
    private Context mContext; 
    private Intent mIntent; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     mContext = context; 
     mIntent = intent; 
     TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 
     int events = PhoneStateListener.LISTEN_CALL_STATE; 

     tm.listen(phoneStateListener, events); 
    } 

    private final PhoneStateListener phoneStateListener = new PhoneStateListener() { 
     @Override 

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

      Log.i(TAG, "number: " + incomingNumber + ""); 
      Toast.makeText(mContext,"Incoming Call: " + incomingNumber + "",Toast.LENGTH_LONG).show(); 
      switch (state) { 
       case TelephonyManager.CALL_STATE_RINGING: 

         SmsManager smsManager =  SmsManager.getDefault(); 
         smsManager.sendTextMessage(incomingNumber, null, "I'm busy bruh", null, null); 
        TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 
        tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); 

      } 

        } 
    }; 
} 

マニフェスト:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.biapps.makin_biscuits"> 
    <uses-sdk android:minSdkVersion="4" /> 

    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.SEND_SMS"/> 

    <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> 

     <activity android:name=".ContactsList"> 
      <intent-filter> 
       <category android:name="android.intent.category.ALTERNATIVE" /> 
      </intent-filter> 
     </activity> 

     <receiver 
      android:name=".IncomingCallReceiver" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
       <action android:name="android.intent.action.Trigger" /> 

      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

MainActivity:あなたのコードで

package com.biapps.makin_biscuits; 

import android.content.Context; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 
    //set object labels and states here 
    private ImageButton icon; 
    private AudioManager am; 
    private ImageButton people; 
    private ImageButton ring; 

    @Override 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

     icon = (ImageButton) findViewById(R.id.icon); 
     icon.setOnClickListener(imgButtonHandler); 
     people = (ImageButton) findViewById(R.id.people); 
     //people.setOnClickListener(peopleButtonHandler); 
     ring = (ImageButton) findViewById(R.id.ring); 

    } 

    int buttonstate = 0; 
    public View.OnClickListener imgButtonHandler = new View.OnClickListener() { 

     public void onClick(View v) { 
      if (buttonstate == 0) { 

       icon.setImageResource(R.drawable.buttonup); 
       buttonstate = 1; 
       am.setRingerMode(0); 
       Toast.makeText(getApplicationContext(), "Go!!", 
         Toast.LENGTH_SHORT).show(); 

       Intent intent = new Intent(); 
       intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
       intent.setAction("android.intent.action.Trigger"); 
       sendBroadcast(intent); 
      } else { 

       icon.setImageResource(R.drawable.button); 
       buttonstate = 0; 
       am.setRingerMode(2); 
       Toast.makeText(getApplicationContext(), "Come back!!", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }; 
} 

答えて

1

以前の状態を認識し、その操作を行うかどうかを決定するコードを追加しました。これで問題は解決しました。

package com.biapps.makin_biscuits; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.PhoneStateListener; 
import android.telephony.SmsManager; 
import android.telephony.TelephonyManager; 
import android.util.Log; 
import android.widget.Toast; 

/** 
* Created by Jake on 3/21/2016. 
*/ 

public class IncomingCallReceiver extends BroadcastReceiver { 

private static final String TAG = "MyListener"; 
    private Context mContext; 
    private Intent mIntent; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     mContext = context; 
     mIntent = intent; 
     TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 
     int events = PhoneStateListener.LISTEN_CALL_STATE; 

     tm.listen(phoneStateListener, events); 
    } 

    int previousState=TelephonyManager.CALL_STATE_OFFHOOK; 
    private final PhoneStateListener phoneStateListener = new PhoneStateListener() { 
     @Override 

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

      int Call_State_Ringing = TelephonyManager.CALL_STATE_RINGING; 
      int Call_State_OffHook = TelephonyManager.CALL_STATE_OFFHOOK; 
      if (Call_State_Ringing == state && Call_State_OffHook == previousState){ 
      Log.i(TAG, "number: " + incomingNumber + ""); 
      Toast.makeText(mContext,"Incoming Call: " + incomingNumber + "",Toast.LENGTH_LONG).show(); 
      switch (state) { 
       case TelephonyManager.CALL_STATE_RINGING: 

         SmsManager smsManager =  SmsManager.getDefault(); 
         smsManager.sendTextMessage(incomingNumber, null, "I'm busy bruh", null, null); 
        TelephonyManager tm = (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE); 
        tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); 

      } 

        } 
      previousState = state; 
    } 
};} 
0

あなたはONR内PhoneStateListenerを登録しますeceive()ので、あなたのonReceiveメソッドが呼び出されるたびにPhoneStateListenerTelephonyManagerに追加します。したがって、同じイベントの複数のリスナーがその期間にわたって存在します。

あなたができることは、その部分をスキップするだけであれば、リスナーが追加されているかどうかを確認する必要があります。

+0

リスナーを確認するにはどうすればよいですか? – Jake

関連する問題