1

Maps API (google-play-services) と ActionBar Sherlock を含むアプリケーションを公開しましたが、あまりにも多くのデバイスと複数のバージョンであまりにも多くのテストを行いました。

しかし、アプリ ( https://play.google.com/store/apps/details?id=br.ufc.ondefica ) を自分のデバイス (Galaxy Ace (GT-S5830B))でダウンロードしたユーザーがいました。引き出しの「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 で表示されるすべてです。それで、インターネットでエラーを探したところ、このエラーはマップアプリが原因で発生する可能性があることがわかりました(ただし、ユーザーは完全に機能しています)、または受け取るIOExceptionコンストラクターと関係がある可能性がありますThrowable like パラメータ (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();
    }
}

前もって感謝します、

4

1 に答える 1

3

クロスポスト:


stracktrace の最初の行からヒントが得られます。

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

IOException基本的に、一部のコンストラクターが欠落していると言っています。javadocsを見ると、API レベル 9 で追加された 2 つのコンストラクターがあります。

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

それはあなたの質問に答えるはずです。API レベル 9 は Android 2.3 です。したがって、スタック トレースは Android 2.2 以下を実行しているデバイスからのものであり、上記の 2 つのコンストラクターがありません。

この問題を解決するには、少なくとも 2 つの解決策があります。

  • minSdkVersionアプリのマニフェストの を に変更します9
  • 最新の Google Play Services ライブラリを使用せず、代わりに Froyo バージョンを使用してください。

後者は SDK Manager にあります。Froyo (Android 2.2) のサポートが終了したため、前回の更新で追加されました。リンクされたブログ投稿からの引用:

現在 Android 2.3 (Gingerbread) 以降のプラットフォーム バージョンを実行しているデバイスの 97% 以上で、今後より強力な API を提供できるようにするために、Google Play サービス SDK のこのリリースから Froyo のサポートを終了します。つまり、Android 2.2 (Froyo) を実行しているデバイスではこれらの新しい API を利用できません。

于 2013-11-19T20:58:18.697 に答える