2012-11-19 9 views
10

मैं (हाँ पढ़ने, APNS नहीं लिख) एक समस्या एंड्रॉयड v 4.2 के पश्चात् में पढ़ने APN के है, यह एक सुरक्षा अपवाद फेंक है:एंड्रॉइड 4.2 में एपीएन पढ़ें?

APN सेटिंग लिखने के लिए कोई अनुमति नहीं: न तो उपयोगकर्ता 10068 और न ही वर्तमान प्रक्रिया में android.permission.WRITE_APN_SETTINGS है।

समान कोड सभी पिछले प्लेटफ़ॉर्म पर काम करने के लिए उपयोग किया जाता है, क्या किसी को इसके आसपास के किसी भी काम के बारे में पता है?

धन्यवाद!

+4

यह एपीएन डेटा सुरक्षित करने के लिए या तो एक बग या हैम-मुट्ठी तरीका जैसा लगता है (उस मामले में एक समर्पित 'READ_APN_SETTINGS 'अनुमति होनी चाहिए)।मुझे इसके लिए दायर कोई समस्या नहीं दिखाई दे रही है, इसलिए यदि आप एक ऐसी परियोजना बना सकते हैं जो त्रुटि को पुन: उत्पन्न करे, इसे पोस्ट करें और http://b.android.com पर निर्देश दें। – CommonsWare

+1

हो गया, आप इसे यहां देख सकते हैं http://code.google.com/p/android/issues/detail?id=39987 – Shatazone

+2

यह भी देखें http://code.google.com/p/android/issues/detail? आईडी = 29,264। उम्मीद है कि एपीएन पढ़ने और लिखने के लिए एक ही समाधान लागू किया जा सकता है। उम्मीद है कि 4.2 से पहले अन्य निर्माताओं द्वारा उठाया जाता है। मुझे एक सपने देखने दो। – Tom

उत्तर

8

यह एक जानबूझकर परिवर्तन प्रतीत होता है। git commit where they added this defense में निम्न टिप्पणी शामिल है:

चूंकि डीबी में कॉर्प पासवर्ड हो सकते हैं, इसलिए हमें इसे सुरक्षित करना चाहिए। डीबी को लिखने के समान ही अनुमति का उपयोग करना संभवतः लिखने के रूप में हानिकारक है।

यह कल्पना की जा सकती है कि आपकी समस्या उन्हें अलग पढ़ने की अनुमति जोड़ने पर विचार करेगी, लेकिन कम से कम समय के लिए, यह 4.2 में एक प्रतिगमन है।

+0

उन सभी एप्लिकेशन का विकल्प क्या है जो संचालन करने के लिए मोबाइल डेटा का उपयोग करते हैं (एमएमएस भेजने की तरह) और यह नहीं पता कि डिवाइस में डिफ़ॉल्ट एपीएन सेटिंग क्या है? – toobsco42

+1

@ toobsco42: मुझे मारता है। यह देखने के लिए कि क्या कोई समाधान है या नहीं, आप एक नया स्टैक ओवरफ्लो प्रश्न खोलना चाहेंगे। – CommonsWare

9

यदि आप एंड्रॉइड 4.2 के लिए एपीएन पढ़ना चाहते हैं और अधिक वे करने के लिए एक बदलाव हैं। मैंने परीक्षण किया और यह काम है।

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; 

मेरी अंग्रेजी काफी अच्छी नहीं है, इसके लिए खेद है।

+0

हाय। मुझे एंड्रॉइड.प्रोवाइडर आयात करने में परेशानी हो रही है। टेलेफ़ोनी। एंड्रॉइड प्रलेखन कहता है कि यह एपीआई 1 9 के बाद से सार्वजनिक है। मैं इसे कैसे आयात कर सकता हूं? – Narseo

+2

एपीआई 1 में यह कोई समस्या नहीं है। वाहक वर्ग इस आयात आयात के साथ उपलब्ध है android.provider.Telephony; यदि यह काम नहीं करता है तो जावा क्लास को स्रोत कोड में ले जाएं और src फ़ोल्डर में आयात करें। – vincent091

+1

मुझे एसडीके अपडेट करना था और फिर यह काम किया। हालांकि, मुझे SqliteWrapper (पहली विधि मेरे लिए काम नहीं की गई है) का उपयोग करके रिपोर्ट किए गए कुछ क्षेत्रों को पढ़ने में परेशानी हो रही है। http://developer.android.com/ में रिपोर्ट किए गए फ़ील्ड में से संदर्भ/एंड्रॉयड/प्रदाता/Telephony.Carriers.html, केवल निम्न लोगों लगते पठनीय होना: Telephony.Carriers.APN, Telephony.Carriers.MMSPROXY, Telephony.Carriers.MMSPORT, Telephony.Carriers.MMSC, Telephony.Carriers.TYPE क्या मुझे अनुमति है (मैंने read_apn_settings पढ़ा है) या कुछ गलत कर रहा है? – Narseo

2

आप /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; 
} 
+0

लेकिन यह एसडीके का हिस्सा नहीं है , यह आपके एंड्रॉइड डिवाइस पर काम नहीं कर सकता है? – Shatazone

+0

हां, अब मुझे पता है कि एचटीसी ने कम से कम एक डिवाइस पर फ़ाइल को हटा दिया है। – notz

+0

यह एंड्रॉइड पर डिफ़ॉल्ट एपीएन कॉन्फ़िगरेशन की सूची है। @Shatazone का उल्लेख है, यह हैंडसेट निर्भर – Narseo

-5

मैं स्थिति भी है, मेरे समाधान AsyncTask में android_assets का उपयोग नहीं करते। "सुनिश्चित करें कि केवल अपने मुख्य थ्रेड आप अनुप्रयोग की संपत्ति का उपयोग करने की अनुमति है dir"

मैं समस्या है जब मैं इस तरह कोडिंग मिल गया:

@Override 
protected void onResume() { 
    super.onResume(); 
    //mWebView.loadUrl("file:///android_asset/95306.html"); 
    new LoadUrlTask().execute("file:///android_asset/95306.html"); 
} 

... 

class LoadUrlTask extends AsyncTask<String, Integer , String> { 
    // progressDialog = new ProgressDialog(LoadActivity.this); 

    @Override 
    protected String doInBackground(String... strings) { 
     mWebView.loadUrl(strings[0]); 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     //progressDialog.dismiss(); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //progressDialog.setMessage("loading..."); 
     //progressDialog.show(); 
    } 
} 

और मैं करके इसे ठीक:

@Override 
protected void onResume() { 
    super.onResume(); 
    mWebView.loadUrl("file:///android_asset/95306.html"); 
    //new LoadUrlTask().execute("file:///android_asset/95306.html"); 
} 

आशा है कि आपकी मदद करेगा!

+2

यह कैसे मदद की जानी चाहिए। आपका उत्तर प्रश्न के दायरे से बाहर है और एपीएन सेटिंग्स तक पहुंचने के लिए कुछ भी नहीं है। – ar34z

संबंधित मुद्दे