6

私のコードは、ユーザーの場所を見つけて、アプリケーションに入るときに地図上にマーカーを配置することになっています。私の場所の値は常にnullに等しく、値を受け取ることはありません。

if (location != null) {
                lat = (int) (location.getLatitude() * 1E6);
                longi = (int) (location.getLongitude() * 1E6);
                GeoPoint ourLocation = new GeoPoint(lat, longi);
                OverlayItem overlayItem = new OverlayItem(ourLocation, "AYO",
                        "Whats good yo");
                CustomPinpoint custom = new CustomPinpoint(d, CampusMap.this);
                custom.insertPinpoint(overlayItem);
                overlayList.add(custom);

            } else {
                Toast.makeText(CampusMap.this, "Couldn't get provider",
                        Toast.LENGTH_SHORT).show();

            }

        }
4

3 に答える 3

1

私が取り組んでいた GPS RPG で比較的似たような問題が発生しました。

まず、場所が最初に見つかるまでに時間がかかる場合があります。場所が null かどうかのみを確認しているため、問題が発生する可能性があります。

何かを行う前に、デバイスの位置情報サービスが実際に有効になっていることを確認することもできます。

private boolean doLocationsCheck(){
    if(!checkLocationEnabled()){

        final CharSequence[] items = {"Yes", "No"};

        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setCancelable(false);
        builder.setTitle("Location must be enabled to play this game! Would you like to enable it now?");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                final int i = item;
                runOnUiThread(new Runnable() {
                    public void run() {                         
                        if(i == 0){
                            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            startActivity(intent);
                            quit();
                        }
                        else{
                            quit();
                        }

                    }
                });
            }


        }).show();
        AlertDialog alert = builder.create();

        return false;

    }
    else {
        return true;
    }
}

private boolean checkLocationEnabled(){

    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER) || service.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    return enabled;
}

プロバイダーが利用可能であることを確認したら、次のように接続をセットアップします。

    private void setupLocation() {

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

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(final Location location) {
            runOnUiThread(new Runnable() {
                public void run() {
                    mLocation = location;
                    //Log.d(TAG, "Latitude: " + location.getLatitude() + " - Longitude: " + location.getLongitude());

                    saveLocation();
                }
            });   
        }

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

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
    };

            //Can set to GPS or network, whichever is available
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}

場所は、更新されるたびにグローバル変数に設定され、設定に保存されます。このように、プロバイダーが有効になっているが、場所を取得するのに時間がかかる場合でも、ユーザーは、アプリが保存した最後の既知の場所でアプリケーションを引き続き使用できます (最初のプログラムには適用されません)。実行されます)。

私はそこに多くのことを残したことを知っていますが、それは自明であるか、以前の回答ですでに説明されているため、実際には必要ではないと考えました.

乾杯〜

于 2012-05-30T17:06:58.720 に答える
0

onCreate の前に場所の値を取得できるように、作成の前に onstartActivity で locationlistener を初期化する必要があります。

于 2012-05-09T12:00:46.287 に答える
0
 /*
 * getting the best location using the location manager
 * Constants.MINIMUM_TIME_BETWEEN_UPDATES = 1000 Constants.MINIMUM_TIME_BETWEEN_UPDATES     = 1
 */
LocationManager mLocation;
private String mBestProvider;
 //   in your onCreate() do the following
    mLocation = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
mBestProvider = mLocation.getBestProvider(criteria, false);
Location location = mLocation.getLastKnownLocation(mBestProvider);
mLocation.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            Constants.MINIMUM_TIME_BETWEEN_UPDATES, 
            Constants.MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
            new LocationListenerManager()
    );


// and use the following locationListener inner class


private class LocationListenerManager implements LocationListener {

    public void onLocationChanged(Location location) {
        String message = String.format(
                "New Location \n Longitude: %1$s \n Latitude: %2$s",
                location.getLongitude(), location.getLatitude()
        );
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        Toast.makeText(MapViewActivity.this, message, Toast.LENGTH_LONG).show();
        Log.v("poiint=====", ""+message);

    }

    public void onStatusChanged(String s, int i, Bundle b) {
        Toast.makeText(MapViewActivity.this, "Provider status changed",
                Toast.LENGTH_LONG).show();
    }

    public void onProviderDisabled(String s) {
        Toast.makeText(MapViewActivity.this,
                "Provider disabled by the user. GPS turned off",
                Toast.LENGTH_LONG).show();
    }

    public void onProviderEnabled(String s) {
        Toast.makeText(MapViewActivity.this,
                "Provider enabled by the user. GPS turned on",
                Toast.LENGTH_LONG).show();
    }

} 
于 2012-04-29T11:20:25.737 に答える