首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhoneStateListener Android坏值

PhoneStateListener Android坏值
EN

Stack Overflow用户
提问于 2017-05-13 16:11:47
回答 1查看 478关注 0票数 1

我在安卓系统上遇到了一个问题。我想知道这个设备是否连接到GSM网络,这样它就可以发送短信了。

我试过两种方法,结果都是一样的。在Moto G 4G上,我可以确定它是否有接入权限。在Redmi 4上,它总是返回false。

第一项:

代码语言:javascript
复制
public static boolean hasCellularAccess(Context context) {
    TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

    if(telephonyManager == null || telephonyManager.getAllCellInfo() == null || telephonyManager.getAllCellInfo().size() == 0){
        return false;
    }

    if (telephonyManager.getAllCellInfo().get(0) instanceof CellInfoLte){
        CellInfoLte cellInfoLte = (CellInfoLte)telephonyManager.getAllCellInfo().get(0);
        CellSignalStrength cellSignalStrengthGsm = cellInfoLte.getCellSignalStrength();
        return cellSignalStrengthGsm.getLevel() > 0;
    }

    CellInfoGsm cellinfogsm = (CellInfoGsm) telephonyManager.getAllCellInfo().get(0);
    CellSignalStrength cellSignalStrengthGsm = cellinfogsm.getCellSignalStrength();
    return cellSignalStrengthGsm.getLevel() > 0;
}

第二项:

代码语言:javascript
复制
public class CustomPhoneListener extends PhoneStateListener {
private static final String TAG = "PhoneListener";

@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
    super.onSignalStrengthsChanged(signalStrength);
    Log.i(TAG, "onSignalStrengthsChanged: " + signalStrength);
    if (signalStrength.isGsm()) {
        Log.i(TAG, "onSignalStrengthsChanged: getGsmSignalStrength "
                + signalStrength.getGsmSignalStrength() + signalStrength);
    }
    try {

        Method[] methods = android.telephony.SignalStrength.class
                .getMethods();
        for (Method mthd : methods) {
            if (mthd.getName().equals("getLteSignalStrength")) {
                Log.i(TAG,
                        "onSignalStrengthsChanged: " + mthd.getName() + " "
                                + mthd.invoke(signalStrength));
            }
        }
    } catch (SecurityException | IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
        e.printStackTrace();
    }

}}

在雷德米号上:

SignalStrength: 0 48 -120 -160 -7 0 -1 99 -93 -6 282 2147483647 ==>值99未知

在Moto号上:

SignalStrength: 99 0 -120 -160 -120 -1 -1 18 -109 -8 116 2147483647 2147483647 0到31之间的==>值是可以的。

以前有人面对过这个问题并解决了吗?我已经读到,这个问题也存在于一些三星银河。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-24 16:11:01

起作用了!

这是我的最后一部作品,行得通。如果手机有很大的正常运行时间值,API似乎会返回坏的值。

代码语言:javascript
复制
public static boolean hasCellularAccess(Context context) {
    TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    if(telephonyManager == null || telephonyManager.getAllCellInfo() == null || telephonyManager.getAllCellInfo().size() == 0){
        return false;
    }

    if (telephonyManager.getAllCellInfo().get(0) instanceof CellInfoLte){
        CellInfoLte cellInfoLte = (CellInfoLte)telephonyManager.getAllCellInfo().get(0);
        CellSignalStrength cellSignalStrengthGsm = cellInfoLte.getCellSignalStrength();
        return cellSignalStrengthGsm.getLevel() > 0;
    }

    if(telephonyManager.getAllCellInfo().get(0) instanceof CellInfoGsm){
        CellInfoGsm cellinfogsm = (CellInfoGsm) telephonyManager.getAllCellInfo().get(0);
        CellSignalStrength cellSignalStrengthGsm = cellinfogsm.getCellSignalStrength();
        return cellSignalStrengthGsm.getLevel() > 0;
    }else {
        CellInfoWcdma cellinfogsm = (CellInfoWcdma) telephonyManager.getAllCellInfo().get(0);
        CellSignalStrength cellSignalStrengthGsm = cellinfogsm.getCellSignalStrength();
        return cellSignalStrengthGsm.getLevel() > 0;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43955280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档