NoSuchMethodError com.google.android.gms.internal.gf
Tengo un problema difícil de resolver. He publicado mi aplicación en Play y todo está bien, pero el problema es que hay 2 dispositivos que bloquea la aplicación con el siguiente error:
java.lang.NoSuchMethodError: java.io.IOException.<init> at com.google.android.gms.internal.gf(Unknown Source) at com.google.android.gms.internal.gb(Unknown Source) at com.google.android.gms.internal.ea(Unknown Source) at com.google.android.gms.internal.ea(Unknown Source) at com.google.android.gms.internal.bq.ac(Unknown Source) at com.google.android.gms.internal.cg$1.run(Unknown Source) at com.google.android.gms.internal.ch$1.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) at java.lang.Thread.run(Thread.java:1096)
Sólo sé este error porque Play me muestra, pero es imposible ver dónde está. Además, tengo otra información. Aquí está la cosa: Sucede cuando el usuario elige ver el mapa en un menú del cajón y el error está en la primera vez él elige.
- Prueba de Google Play Alpha y Beta con diferentes puntos finales o parámetros personalizados
- Cómo configurar la arquitectura de la CPU en APK para Google Play
- Cómo empaquetar una app de WatchFace sólo para la publicación de Google Play
- Android Market - los únicos informes de fallos que obtengo están en las plataformas "OTHER"
- Los comentarios de los usuarios no aparecen en Google Play
Aquí está el código de este fragmento:
package br.ufc.ondefica.fragments; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import br.ufc.ondefica.MainActivity; import br.ufc.ondefica.R; import br.ufc.ondefica.model.Placemark; import br.ufc.ondefica.utils.DataHelper; import br.ufc.ondefica.utils.ParserKML; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; public class UFCMapFragment extends FragmentWithSearch { private GoogleMap map; private int positionToShow = 3; private boolean isDefaultView = true; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.map_layout, container, false); ((MainActivity) getActivity()).setTitle(getResources().getStringArray(R.array.sliding_menu)[0]); return root; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); map = ((SupportMapFragment) getActivity().getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); map.setMyLocationEnabled(true); Bundle bundle = getArguments(); if (bundle != null && bundle.containsKey("positionToShow")) { isDefaultView = false; positionToShow = bundle.getInt("positionToShow"); } loadMap(); // Move the camera instantly to the default place to show with a zoom of // 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(DataHelper.data.places .get(positionToShow).getCoordinates(), 13)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(16), 4000, null); } private void loadMap() { for (int i = 0; i < DataHelper.data.places.size(); i++) { Placemark place = DataHelper.data.places.get(i); Marker marker = map.addMarker(new MarkerOptions() .icon(BitmapDescriptorFactory.fromResource(ParserKML .loadMapOfIcons(place.getIconID()))) .title(place.getName()).snippet(place.getDescription()) .position(place.getCoordinates())); if (i == positionToShow && !isDefaultView) marker.showInfoWindow(); } } public void onDestroyView() { super.onDestroyView(); Fragment fragment = (getFragmentManager().findFragmentById(R.id.map)); FragmentTransaction ft = getActivity().getSupportFragmentManager() .beginTransaction(); ft.remove(fragment); ft.commit(); } }
Los dispositivos que se bloquean son: Samsung Galaxy ACE (GT-S5830B) y Samsung Galaxy 5 (GT-I5500B). Gracias por adelantado,
- Publicar una aplicación privada de Android para varios clientes
- Administrar varias suscripciones para un solo artículo para varios usuarios
- Cómo subir dos archivos apk con niveles de API de dif de una sola aplicación de Android
- ¿Hay alguna manera de comprobar el código de versión de la aplicación Play Store?
- Se requiere Google Play Services, pero Google Play (mercado) no está instalado. ¿Qué hacer?
- Diseño de aplicaciones de Android para tablets
- Proceso de revisión de Google Play Android
- No se puede analizar el error de respuesta al cargar capturas de pantalla en Google Play (Android Market)
La primera línea en el stracktrace le da una pista:
java.lang.NoSuchMethodError: java.io.IOException.<init>
Básicamente está diciendo que falta algún constructor para IOException
. En cuanto a los javadocs , hay dos constructores que se agregaron en el nivel 9 de la API:
public IOException (Throwable cause) public IOException (String message, Throwable cause)
Eso debería responder a su pregunta. API nivel 9 es Android 2.3. Por lo tanto, el seguimiento de la pila es de un dispositivo con Android 2.2 o inferior, que está faltando a los dos constructores anteriores.
Hay al menos dos soluciones para resolver el problema:
- Cambia la
minSdkVersion
en el manifiesto de tu aplicación a9
. - No utilice la última biblioteca de Google Play Services, pero utilice la versión de Froyo en su lugar.
Este último se puede encontrar en el SDK Manager. Se agregó con la última actualización porque se eliminó el soporte para Froyo (Android 2.2). Cita de la entrada de blog vinculado:
Con más del 97% de los dispositivos que ejecutan Android 2.3 (Gingerbread) o versiones de plataformas más nuevas, dejaremos de admitir Froyo de esta versión del SDK de servicios de Google Play para poder ofrecer APIs más potentes en el futuro. Esto significa que no podrá utilizar estas nuevas API en dispositivos con Android 2.2 (Froyo).
- ¿Cómo conectar un socket SSL a través de un proxy HTTP?
- Android: agregar borde alrededor de textview