94 lines
2.9 KiB
Java
94 lines
2.9 KiB
Java
package com.newland;
|
||
|
||
import java.lang.reflect.Field;
|
||
import java.lang.reflect.Method;
|
||
import com.android.internal.telephony.ITelephony;
|
||
|
||
import android.app.Service;
|
||
import android.content.Context;
|
||
import android.telecom.TelecomManager;
|
||
import android.telephony.TelephonyManager;
|
||
import android.util.Log;
|
||
|
||
public class PhoneUtils {
|
||
/**
|
||
* 从TelephonyManager中实例化ITelephony,并返回
|
||
*/
|
||
static public ITelephony getITelephony(TelephonyManager telMgr)
|
||
throws Exception {
|
||
Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod(
|
||
"getITelephony");
|
||
getITelephonyMethod.setAccessible(true);// 私有化函数也能使用
|
||
return (ITelephony) getITelephonyMethod.invoke(telMgr);
|
||
}
|
||
|
||
public static int getSDKVersionNumber() {
|
||
int sdkVersion;
|
||
try {
|
||
sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK_INT);
|
||
} catch (NumberFormatException e) {
|
||
sdkVersion = 0;
|
||
}
|
||
return sdkVersion;
|
||
}
|
||
|
||
//判断手机是否处于正在通话中
|
||
public static boolean phoneIsInUse(Context context) {
|
||
int sdkVer = getSDKVersionNumber();
|
||
if(sdkVer >= 23) {
|
||
return phoneIsInUse6_0(context);
|
||
} else {
|
||
return phoneIsInUse5_0(context);
|
||
}
|
||
}
|
||
//Android如何判断手机是否处于正在通话中,Android 6.0之前(具体版本没追溯)用的方法(在Android 5.1上好用)
|
||
public static boolean phoneIsInUse5_0(Context context) {
|
||
boolean phoneInUse = false;
|
||
TelephonyManager mTelephonyManager = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
|
||
Class<TelephonyManager> c = TelephonyManager.class;
|
||
Method getITelephonyMethod = null;
|
||
try {
|
||
getITelephonyMethod = c.getDeclaredMethod("getITelephony",
|
||
(Class[]) null);
|
||
getITelephonyMethod.setAccessible(true);
|
||
ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(
|
||
mTelephonyManager, (Object[]) null);
|
||
phoneInUse = !iTelephony.isIdle();
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
}
|
||
return phoneInUse;
|
||
}
|
||
|
||
//Android 6.0之后用以上方法不好用了,遍寻源码及网上资料得已下方法(在Android 6.0上好用):
|
||
public static boolean phoneIsInUse6_0(Context context){
|
||
TelecomManager tm = (TelecomManager)context.getSystemService(Context.TELECOM_SERVICE);
|
||
return tm.isInCall();
|
||
}
|
||
|
||
static public void printAllInform(Class clsShow) {
|
||
try {
|
||
// 取得所有方法
|
||
Method[] hideMethod = clsShow.getDeclaredMethods();
|
||
int i = 0;
|
||
for (; i < hideMethod.length; i++) {
|
||
Log.e("method name", hideMethod[i].getName());
|
||
}
|
||
// 取得所有常量
|
||
Field[] allFields = clsShow.getFields();
|
||
for (i = 0; i < allFields.length; i++) {
|
||
Log.e("Field name", allFields[i].getName());
|
||
}
|
||
} catch (SecurityException e) {
|
||
// throw new RuntimeException(e.getMessage());
|
||
e.printStackTrace();
|
||
} catch (IllegalArgumentException e) {
|
||
// throw new RuntimeException(e.getMessage());
|
||
e.printStackTrace();
|
||
} catch (Exception e) {
|
||
// TODO Auto-generated catch block
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|