Lee APN en Android 4.2?

Tengo un problema al leer APN en Android v4.2 (Sí, leyendo, sin escribir APNS) , arroja una excepción de seguridad:

No permission para escribir configuraciones APN: Ni el usuario 10068 ni el proceso actual tienen android.permission.WRITE_APN_SETTINGS.

El mismo código utilizado para trabajar en todas las plataformas anteriores, ¿alguien sabe de algún trabajo al respecto?

¡Gracias!

Esto parece ser un cambio intencional. El git commit donde agregaron esta defensa incluye el siguiente comentario:

Como el DB puede contener contraseñas de corp, debemos asegurarlo. Usar el mismo permiso que escribir en el DB ya que la lectura es potencialmente tan perjudicial como una escritura.

Es concebible que su problema haga que consideren agregar un permiso de lectura por separado, pero al menos por el momento, esta es una regresión en 4.2.

Si quieres leer APN para Android 4.2 y más, es un cambio que debes hacer. Probé y es trabajo.

En Android 4.1 y versiones inferiores, usa esto:

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

Y para Android 4.2 y superior, use este código:

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

Y esta línea:

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

SQLiteWrapperClass está oculto (encontró esta clase en internet)

 import android.database.sqlite.SqliteWrapper; 

Mi inglés no es muy bueno, lo siento por esto.

Puede leer la configuración predeterminada de /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 attributes = new HashMap(); for (int i=0; i 

También tengo la situación, mi solución es no acceder a android_assets en AsyncTask. ” Asegúrate de que solo tu hilo principal tenga permiso para acceder al directorio de activos de tu aplicación

Obtuve el problema cuando codifico así:

 @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 { // 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(); } } 

y lo soluciono por:

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

¡Espero que te ayude!