0

まず最初に、英語で申し訳ありません。私は英語の書き方がよくわかりません。

ユーザーの位置を地図上に表示するアプリケーションを作成しています。ドキュメントに従って、リスナーを作成し、自分の場所にオーバーレイを追加しました。

Motorola Defy (MB525) を含む他のすべての Android デバイスでは、私のアプリケーションは正常に動作しますが、(MB526) では明らかに異なる座標を受け取りません。

public class TesteMapActivity extends MapActivity {

    private LocationManager locationManager;

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();

        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setAltitudeRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);

        String provider = locationManager.getBestProvider(criteria, true);

        locationManager.requestLocationUpdates(provider, 0, 0, locationListener);

        MapView mapView = (MapView) findViewById(R.id.mapview);
        MapController mapController = mapView.getController();
        mapView.setSatellite(false);
        mapView.setStreetView(false);
        mapView.setBuiltInZoomControls(true);

        mapController.setZoom(16);
    }

    private LocationListener locationListener = new LocationListener() {

        int i = 0;

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) { }

        @Override
        public void onProviderEnabled(String provider) { }

        @Override
        public void onProviderDisabled(String provider) { }

        @Override
        public void onLocationChanged(Location location) {
            i++;
            animeTo(location, i);
        }
    };

    public void animeTo(Location location, int i) {
        TextView txtCoordenadas = (TextView) findViewById(R.id.txtCoordenadas);

        txtCoordenadas.setText(i + " " + location.getLatitude() + ", " + location.getLongitude());

        MapView mapView = (MapView) findViewById(R.id.mapview);
        MapController mapController = mapView.getController();

        if (mapView.getOverlays().size() >= 1) {
            mapView.getOverlays().removeAll(mapView.getOverlays());
        }

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = getResources().getDrawable(R.drawable.ponto);
        OtemizedOverlay itemizedoverlay = new OtemizedOverlay(drawable, TesteMapActivity.this);

        Double lat = location.getLatitude() * 1E6;
        Double log = location.getLongitude() * 1E6;

        GeoPoint point = new GeoPoint(lat.intValue(), log.intValue());
        OverlayItem overlayitem = new OverlayItem(point, "Minha Localização", "Latitude: " + lat + " Longitude: " + log);

        itemizedoverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedoverlay);

        mapController.animateTo(point);
    }
}

public class OtemizedOverlay extends ItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private Context mContext;

    public OtemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
    }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    @Override
    public int size() {
        return mOverlays.size();
    }

    public OtemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
    }

    @Override
    protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
    }
}

誰でも私を助けることができますか?

ありがとうございました。

4

2 に答える 2

0

Defy+ハードウェア/デフォルト構成にはバグがあります。

あなたはこのリンクであなたのデバイスのための解決策を持つことができます。

このデバイス専用のアプリを開発している場合、考える最良の方法はそれを忘れることです。Defy +はめちゃくちゃで、役に立たないがらくたです。

リスナーを直接殺さないことをお勧めします。場所が混乱し、他のデバイスの動作が悪くなります。したがって、100%がうまく機能しないよりも、1%の問題がある方がよいのです。

于 2012-06-20T00:50:16.037 に答える
0

まず第一に、David と Kaneto、Paulo 私を大いに助けてくれてありがとう。

解決策を見つけました。同じ問題がある場合は、これを使用して解決してください。

メソッド animeTo を AsyncTask() に変更します。

public void animeTo(Location location) {
     new AsyncTask() {  
            protected Object doInBackground(Object... params) {  

                //your code   
                return null;  
            }  
        }.execute(new Void[0]);
}

これは私のテストではうまくいきます。

繰り返しますが、英語で申し訳ありません。英語の書き方がよくわかりません。

于 2012-06-22T14:49:57.020 に答える