0

ユーザーの場所を取得するための次のクラスがあります。

public class GetUserLocation extends Activity {

Timer timer1;

LocationManager locationManager = null;
LocationResult locationResult;
boolean gpsEnabled = false;
boolean networkEnabled = false;
public static Location userLocation = null;

public String checkProviders(Context context) {
    if (locationManager == null) {
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }
    try {
        gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
        ex.printStackTrace();
        gpsEnabled = false;
    }

    try {
        networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex) {
        ex.printStackTrace();
        networkEnabled = false;
    }

    if(!gpsEnabled && !networkEnabled)
        return "No Location Service Found.\nPlease turn on your location service by\nenabling GPS or Data Service or WI-FI";

    if(gpsEnabled && !networkEnabled)
        return "No Internet Service Found.\nPlease turn on your inernet service by\nenabling Data Service or WI-FI";

    return null;

}

public boolean getLocation(Context context, LocationResult result) {
    locationResult = result;

    if (locationManager == null) {
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }

    // exceptions will be thrown if provider is not permitted.
    try {
        gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {

    }

    try {
        networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    // don't start listeners if no provider is enabled
    if (!gpsEnabled && !networkEnabled)
        return false;

    if (gpsEnabled) {
        locationManager.removeUpdates(locationListenerGps);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,locationListenerGps);
    }

    if (networkEnabled) {
        locationManager.removeUpdates(locationListenerNetwork);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,locationListenerNetwork);
    }

    timer1 = new Timer();
    //timer1.schedule(new GetLastLocation(), 30000);

    return true;
}

LocationListener locationListenerGps = new LocationListener() {

    @Override
    public void onLocationChanged(Location location) {
        timer1.cancel();

        locationResult.gotLocation(location);
        locationManager.removeUpdates(this);
        locationManager.removeUpdates(locationListenerNetwork);
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

LocationListener locationListenerNetwork = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        timer1.cancel();
        locationResult.gotLocation(location);
        locationManager.removeUpdates(this);
        locationManager.removeUpdates(locationListenerGps);
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

//  class GetLastLocation extends TimerTask {
//      @Override
//      public void run() {
//          
//          locationManager.removeUpdates(locationListenerGps);
//          locationManager.removeUpdates(locationListenerNetwork);
//          
//          Location networkLocation = null, gpsLocation = null;
//          if (gpsEnabled) {
//              //t = Calendar.getInstance().getTimeInMillis();
//              gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//          }
//          
//          if (networkEnabled) {
//              networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//          }
//          
//          // if there are both values use the latest one
//          if (gpsLocation != null && networkLocation != null) {
//              
//              if (gpsLocation.getTime() > networkLocation.getTime())
//                  locationResult.gotLocation(gpsLocation);
//              else
//                  locationResult.gotLocation(networkLocation);
//              
//              return;
//          }
//          
//          if (gpsLocation != null) {
//              locationResult.gotLocation(gpsLocation);
//              return;
//          }
//          
//          if (networkLocation != null) {
//              locationResult.gotLocation(networkLocation);
//              return;
//          }
//          
//          locationResult.gotLocation(null);
//      }
//  }

public static abstract class LocationResult {
    public abstract void gotLocation(Location location);
}

public void removeUpdates() {
    if(timer1!=null) {
        timer1.cancel();
    }
    locationManager.removeUpdates(locationListenerGps);
    locationManager.removeUpdates(locationListenerNetwork);
    userLocation = null;
    locationResult.gotLocation(null);
}

public Timer getTimer() {
    return this.timer1;
}

}

このコードは他のデバイスではうまく機能しますが、Galaxy s3 では機能しません。しかし、テスト用の S3 デバイスでは、Google マップがユーザーの位置を修正しています。

なぜこれが起こっているのか誰にも言えますか?ヒントをいただければ幸いです。

4

1 に答える 1

0

GPSをリセットするAPP GPS Statusをインストールして、このような問題を解決しました。http://productforums.google.com/forum/#!topic/maps/q24Cq4sQAtc%5B1-25-false%5D または、「マップ」からアプリ データを消去してみてください
プロンプトが表示されたら、位置情報サービスへのアクセスを再許可する必要があります。

抱擁

于 2013-07-19T18:55:42.697 に答える