1

我已經發布了一個包含maps api(google-play-services)和ActionBar Sherlock的應用程序,並且我在太多的設備上做了太多的測試,有幾個版本。Galaxy Ace上的NoSuchMethodError(GT-S5830B)

但是有一個用戶使用他的設備(Galaxy Ace(GT-S5830B))下載了應用程序(https://play.google.com/store/apps/details?id=br.ufc.ondefica),當他去到抽屜裏的「Ver Mapa」(見地圖)菜單時,他有以下例外:

java.lang.NoSuchMethodError: java.io.IOException.<init> 
at com.google.android.gms.internal.g.f(Unknown Source) 
at com.google.android.gms.internal.g.b(Unknown Source) 
at com.google.android.gms.internal.e.a(Unknown Source) 
at com.google.android.gms.internal.e.a(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) 

這是Google Play給我顯示的所有內容。所以,我查找了Internet上的錯誤,我發現由於地圖應用程序可能會發生此錯誤(但它完美地工作,說用戶),或者可能會與接收到的IOException構造函數有關類似Throwable的參數(API級別9)。我不知道這個錯誤在哪裏,即使是因爲它在與此設備相同的API級別的其他設備上工作。

這是我的MapFragment代碼:

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

由於提前,從

回答

3

交叉貼:


在stracktrace第一行給你一個線索:

java.lang.NoSuchMethodError: java.io.IOException.<init> 

基本上它說,有些構造函數IOException丟失。縱觀javadocs,有API級別9中添加的兩個構造函數:

public IOException (Throwable cause) 
public IOException (String message, Throwable cause) 

這應該回答你的問題。 API等級9是Android 2.3。因此,堆棧跟蹤來自運行Android 2.2或更低版本的設備,它缺少上述兩個構造函數。

至少有兩種解決方案來解決這個問題:

  • 改變你的應用程序的清單中minSdkVersion9
  • 請勿使用最新的Google Play服務庫,而應使用Froyo版本。

後者可以在SDK Manager中找到。它添加了last update,因爲對Froyo(Android 2.2)的支持已經下降。從鏈接的博客文章引用:

隨着現在運行的是Android 2.3(薑餅)設備的97%以上或 新平臺的版本,我們從這個 版本的谷歌Play服務SDK的下降爲Froyo的支持爲了使其成爲可能, 將來會提供更強大的API。這意味着您不會在運行Android 2.2(Froyo)的設備上使用這些新的API,因此無法使用 。