这段代码为什么不能挂电话?解决办法
这段代码为什么不能挂电话?
我参照网上给的方法,做一个来电防火墙。
原理:通过反射利用广播的形式拦截黑名单里的电话,在2.2的模拟器上跑完全可以,但是为什么在小米上不行呢?拦截部分代码如下:
#Code
package junsu.wen.PhoneWallPack;
import java.lang.reflect.Method;
import junsu.wen.BussinessLogic.PhoneWallManager;
import com.android.internal.telephony.ITelephony;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.telephony.TelephonyManager;
public class Phonemanager extends BroadcastReceiver {
private AudioManager mAudioManager;
private ITelephony mITelephony;
//来电防火墙 SQLite数据库存储
private PhoneWallManager pwm=null;
@Override
public void onReceive(Context context, Intent intent) {
//初始化数据
Phone(context);
String action = intent.getAction();
//如果广播是关于电话号状态的
if ("android.intent.action.PHONE_STATE".equals(action)) {
//获取来电状态
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
//获取来电号码
String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
// 电话正在响铃
if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {
// 拦截指定的电话号码
if (pwm.Exist(number)==true) {
// 先静音处理
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
try {
// 挂断电话
mITelephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
// 再恢复正常铃声
mAudioManager
.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
}
}
}
private void Phone(Context context)
{
pwm=new PhoneWallManager(context);
//利用反射获取隐藏的endcall方法
TelephonyManager mTelephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
try {
Method getITelephonyMethod = TelephonyManager. class .getDeclaredMethod( "getITelephony" , (Class[]) null );
getITelephonyMethod.setAccessible( true );
mITelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null );
} catch (Exception e) {
e.printStackTrace();
}
}
}
#EndCode
猜测:1.小米隐藏了此API,反射不成功
2.以上代码所使用API已过时
这个问题昨晚困扰了我很久,能请官方的亲给一个答复吗??
------解决方案--------------------
小米手机的android版本是多少啊?我感觉是相关api已过时
------解决方案--------------------
再用其它 真机 调试下 貌似和小米本身有很大关系
------解决方案--------------------
小米是android2.3,正在弄2.4~ 你试试在2.3的模拟器上能不能跑~
我参照网上给的方法,做一个来电防火墙。
原理:通过反射利用广播的形式拦截黑名单里的电话,在2.2的模拟器上跑完全可以,但是为什么在小米上不行呢?拦截部分代码如下:
#Code
package junsu.wen.PhoneWallPack;
import java.lang.reflect.Method;
import junsu.wen.BussinessLogic.PhoneWallManager;
import com.android.internal.telephony.ITelephony;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.telephony.TelephonyManager;
public class Phonemanager extends BroadcastReceiver {
private AudioManager mAudioManager;
private ITelephony mITelephony;
//来电防火墙 SQLite数据库存储
private PhoneWallManager pwm=null;
@Override
public void onReceive(Context context, Intent intent) {
//初始化数据
Phone(context);
String action = intent.getAction();
//如果广播是关于电话号状态的
if ("android.intent.action.PHONE_STATE".equals(action)) {
//获取来电状态
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
//获取来电号码
String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
// 电话正在响铃
if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {
// 拦截指定的电话号码
if (pwm.Exist(number)==true) {
// 先静音处理
mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
try {
// 挂断电话
mITelephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
// 再恢复正常铃声
mAudioManager
.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
}
}
}
private void Phone(Context context)
{
pwm=new PhoneWallManager(context);
//利用反射获取隐藏的endcall方法
TelephonyManager mTelephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
try {
Method getITelephonyMethod = TelephonyManager. class .getDeclaredMethod( "getITelephony" , (Class[]) null );
getITelephonyMethod.setAccessible( true );
mITelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null );
} catch (Exception e) {
e.printStackTrace();
}
}
}
#EndCode
猜测:1.小米隐藏了此API,反射不成功
2.以上代码所使用API已过时
这个问题昨晚困扰了我很久,能请官方的亲给一个答复吗??
------解决方案--------------------
小米手机的android版本是多少啊?我感觉是相关api已过时
------解决方案--------------------
再用其它 真机 调试下 貌似和小米本身有很大关系
------解决方案--------------------
小米是android2.3,正在弄2.4~ 你试试在2.3的模拟器上能不能跑~