当前位置: 首页 > 知识库问答 >
问题:

阅读Android4.2中的APN?

邵赞
2023-03-14

我在Android v4中读取APN时遇到问题。2(是读,不是写APN),它抛出了一个安全异常:

没有写入APN设置的权限:用户10068和当前进程都没有android。准许写入APN设置。

以前所有平台上都使用相同的代码,有人知道有什么解决方法吗?

谢谢

共有3个答案

濮翰学
2023-03-14

您可以从/etc/apns-conf.xml读取默认设置:

private boolean getSettingsFromApnsFile(Context context, String apnName) {
    FileReader reader = null;
    boolean sawValidApn = false;

    try {
        reader = new FileReader("/etc/apns-conf.xml");

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(reader);

        TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
        String simOperator = telephonyManager.getSimOperator();
        if (TextUtils.isEmpty(simOperator)) {
            logger.warn("unable to get sim operator - so unable to get mms config");
            return false;
        }

        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG && xpp.getName().equals("apn")) {
                HashMap<String, String> attributes = new HashMap<String, String>();
                for (int i=0; i<xpp.getAttributeCount(); i++) {
                    attributes.put(xpp.getAttributeName(i), xpp.getAttributeValue(i));
                }
                if (attributes.containsKey("mcc") && attributes.containsKey("mnc") && simOperator.equals(attributes.get("mcc")+attributes.get("mnc"))) {
                    if (!TextUtils.isEmpty(apnName) && !apnName.trim().equals(attributes.get("apn"))) {
                        eventType = xpp.next();
                        continue;
                    }

                    if (isValidApnType(attributes.get("type"), PhoneConstants.APN_TYPE_MMS)) {
                        sawValidApn = true;

                        String mmsc = attributes.get("mmsc");
                        if (mmsc == null) {
                            eventType = xpp.next();
                            continue;
                        }

                        mServiceCenter = NetworkUtil.trimV4AddrZeros(mmsc.trim());
                        mProxyAddress = NetworkUtil.trimV4AddrZeros(
                                attributes.get("mmsproxy"));
                        if (isProxySet()) {
                            String portString = attributes.get("mmsport");
                            try {
                                mProxyPort = Integer.parseInt(portString);
                            } catch (NumberFormatException e) {
                                if (TextUtils.isEmpty(portString)) {
                                    logger.warn("mms port not set!");
                                } else {
                                    logger.error("Bad port number format: " + portString, e);
                                }
                            }
                        }
                    }

                }
            }
            eventType = xpp.next();
        }
    } catch (Exception e) {
        logger.warn("unable to get mmsc config from apns-conf file", e);
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (Exception e) {
            }
        }
    }
    return sawValidApn;
}
钱卓君
2023-03-14

这似乎是有意的更改。他们添加此防御的git提交包括以下注释:

由于数据库可能包含公司密码,我们应该保护它。使用与写入数据库相同的权限作为读取可能和写入一样有害。

可以想象的是,您的问题会导致他们考虑添加一个单独的读权限,但至少暂时来说,这是一个4.2的回归。

公羊凌
2023-03-14

如果你想阅读Android4.2和更多的APN,他们是一个改变。我测试了,它的工作。

在Android 4.1及以下版本中,请使用:

Cursor c = getContentResolver().query(Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"), null, null, null, null);

对于Android 4.2及以上版本,请使用以下代码:

private static final String[] APN_PROJECTION = {
     Telephony.Carriers.TYPE,            // 0
     Telephony.Carriers.MMSC,            // 1
     Telephony.Carriers.MMSPROXY,        // 2
     Telephony.Carriers.MMSPORT          // 3
 };

这句话:

final Cursor apnCursor =SqliteWrapper.query(context, this.context.getContentResolver(), Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), APN_PROJECTION, null, null, null);

SQLiteWrapperClass是隐藏的(在互联网上发现这个类)

import android.database.sqlite.SqliteWrapper;

我的英语不太好,抱歉。

 类似资料:
  • 我想创建一个独立的scala代码,使用自定义设置在MongoDB网站上使用该代码从MongoDB读取。 当我运行SBT包时,我会遇到一些错误。我猜这与SparkSession的错误创作方法有关。你能给我一个提示来修理它吗? 我的内容 Firstapp.scala代码 以及运行后的错误 编辑1: 我尝试了这个解决方案,但没有正确编译。内容同上。我改变了转换为: 汇编结果如下: 编辑2: 我添加了to

  • 我有以下类,它从/到包裹读取和写入对象数组: 在上面的代码中,我在读取< code>readParcelableArray时得到一个< code>ClassCastException: 错误/AndroidRuntime(5880):原因:Java . lang . classcastexception:[land roid . OS . parcelable; 上面的代码有什么错误?在编写对象数

  • 问题内容: 我有以下从缓冲读取器读取数据的示例: 每当缓冲读取器中出现某些情况时(在这种情况下),将执行循环中的代码。在我的情况下,如果客户端应用程序将某些内容写入套接字,则将执行循环中的代码(服务器应用程序中)。 但是我不明白它是如何工作的。等待直到缓冲读取器中出现某些内容,当其中出现某些内容时,它将返回并执行循环中的代码。但是什么时候可以退货。 还有另一个问题。上面的代码摘自一个方法,我在线程

  • 问题内容: 在Golang中处理原始IP软件包时,遇到了一个问题,我似乎无法找到以下解决方案: 在IPv4的说明书中包含有大于8位小字段。例如,版本或报头长度(每个4位)或标志(3位)。 如何从io.Reader中读取这些值,然后再使用Golang处理它们?到目前为止,我一直在使用binary.Read方法,但是由于Golang中最小的整数类型是int8,因此在这种情况下是不可能的。 问题答案:

  • 在问题[1]中,我了解到如果您想在Android下使用NFC标签,则不必采用NDEF格式。我想在Win 8.1 in. Net下执行此操作。我的情况是这样的: 我有一个RFID卡Mifare Classic 1K,其中存储了一个ID。(由制造商记录)该ID由我们的考勤系统通过通常的RFID读取器(例如Gigatek的PROMAG MFR120)读取。我们不在卡上写任何东西,我们只需要读取ID。但是

  • 问题内容: CSS属性属性如何读取? 难道,......? 答: 从下面的答案中,它看起来很简单,或者。 问题答案: “!important”声明(定界符“!”和关键字“ important”紧随该声明)优先于普通声明。 基本上,在两个样式规则相同的地方……它给了一个明显的重要性,并将应用这些样式。 例 即使第二条规则更具体,也将应用第一条规则(一个元素+一个类,而不是一个元素) 注意: 当您拥有