【问题标题】:Auto Call reject Android自动呼叫拒绝 Android
【发布时间】:2013-04-19 19:02:07
【问题描述】:

在我的应用中,如果手机处于充电状态,我想拒绝来电。

请任何人查看我的代码并指出我做错了什么?尤其是拒绝功能。

我已经尝试了好几天了,但它不起作用!

我有以下代码:

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();
    }
}
}

【问题讨论】:

  • telephonyService.silenceRinger();从 2.3+ 起不再有效。您应该改用 AudioManager。
  • 好的。我会试试的。谢谢。

标签: java android call telephonymanager


【解决方案1】:

我在这里看到的一个问题是:

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

应该是

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

字符串比较应该使用equals()而不是==

注意:确保incomingNumber 不是null

【讨论】:

  • @user1756004:它会抛出任何异常吗?如果不是,我建议先添加一些 System.out 来弄清楚流程,就像它是否进入拒绝方法一样?如果是这样,它在哪里失败等等,
  • 进入方法。奇怪的是我似乎找不到任何错误。我会继续努力的,谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-06-30
  • 2013-02-01
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
相关资源
最近更新 更多