Question

In my app I want to reject a call if the phone is in charging state.

Please can anyone review my code and point out what I'm doing wrong? Especially the reject function.

I'm trying to implement this for days and it just not working!

I have the following code:

MyPhoneStateListener.java:

import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.BatteryManager;
import android.telephony.PhoneStateListener;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

public class MyPhoneStateListener extends PhoneStateListener {
private Context contextMember;
private String strRegisterNumber1 = "";
private String strRegisterNumber2 = "";
public  FileManager fileManager;
 // private ITelephony telephonyService;

public MyPhoneStateListener(Context context) {
    super();
    // TODO Auto-generated constructor stub
    contextMember = context;
}

public void onCallStateChanged(int state, String incomingNumber)
{
    fileManager = new FileManager(contextMember);

    strRegisterNumber1 = fileManager.getItems(0);
    strRegisterNumber2 = fileManager.getItems(1);

    switch (state)
    {
    case TelephonyManager.CALL_STATE_IDLE:
        Log.i("DEBUG", "idle");
        break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
        AudioManager audioManager = (AudioManager) contextMember.getSystemService(Context.AUDIO_SERVICE);
        audioManager.setSpeakerphoneOn(true);
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);         
        break;
    case TelephonyManager.CALL_STATE_RINGING:
        if (incomingNumber == strRegisterNumber1 || incomingNumber == strRegisterNumber2) // register phone caller
        {
            if (isCharging())
            {
                reject();
                sendSMS(incomingNumber);
            } else
            {
                return;
            }
        } else
        {
            reject();
        }
        break;
    }
}

public void reject() // phone call reject
{
    TelephonyManager telephony = (TelephonyManager)contextMember.getSystemService(Context.TELEPHONY_SERVICE);
    try {
        Class c = Class.forName(telephony.getClass().getName());
        Method m = c.getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        ITelephony telephonyService = (ITelephony) m.invoke(telephony);
        telephonyService.silenceRinger();
        telephonyService.endCall();

        AlertDialog.Builder builder = new AlertDialog.Builder(contextMember);
        builder.setTitle("reject status");
        builder.setMessage("reject sucess").setCancelable(false).setPositiveButton("OK", null);
        AlertDialog alert = builder.create();
        alert.show();

    } catch(Exception e)
    {
        e.printStackTrace();
    }
}

public boolean isCharging()
{
    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Intent batteryStatus = contextMember.registerReceiver(null, ifilter);
    int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
    boolean bCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
                         status == BatteryManager.BATTERY_STATUS_FULL;
    return bCharging;
}

public void sendSMS(String phoneNumber)
{
    String message = "I am at home";

    try {
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNumber, null, message, null, null);
        Toast.makeText(contextMember.getApplicationContext(), "SMS Sent", Toast.LENGTH_LONG).show();
    } catch (Exception e)
    {
        Toast.makeText(contextMember.getApplicationContext(), "SMS faild, please try again later!", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}
}
Was it helpful?

Solution

One issue I see here is:

 if (incomingNumber == strRegisterNumber1 || incomingNumber == strRegisterNumber2)

should be

 if (incomingNumber.equals( strRegisterNumber1) || incomingNumber.equals( strRegisterNumber2))

String comparison should use equals() instead of ==

Note: Make sure incomingNumber is not null.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top