2016-10-24 3 views
2

Android 위치 정보를 얻으려고합니다.이 코드는 아직 반환되지 않았습니다. 스택 오버플로를 검색했습니다.Android 위치 업데이트가 반환되지 않습니다.

이 버그를 발견했습니다 : https://code.google.com/p/android/issues/detail?id=57707 하지만 지금까지 수정 사항이 없거나 찾을 수 없습니다. 이것은 코드입니다. 어떤 도움이 많이 주시면 감사하겠습니다

Criteria criteria = new Criteria(); 
    criteria.setCostAllowed(true); 
    criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
    final LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    String provider = lm.getBestProvider(criteria, true); 
    Location l = lm.getLastKnownLocation(provider); 
    final String date = fmtForPresenter.print(dt); 
    if(l==null) { 
     lm.requestLocationUpdates(provider, 100, 200, 
       new android.location.LocationListener() { 
        @Override 
        public void onStatusChanged(String provider, int status, 
               Bundle extras) { 
        } 

        @Override 
        public void onProviderEnabled(String provider) { 
         Log.e("PROVIDER", "PRO: " + provider); 
        } 

        @Override 
        public void onProviderDisabled(String provider) { 
         Log.e("PROVIDER", "PRO: " + provider); 
        } 

        @Override 
        public void onLocationChanged(final Location location) { 

         lat = location.getLatitude(); 
         lng = location.getLongitude(); 
         presenter.getFoot(userProfile.getToken(),"public",lat,lng,date); 
         if ((ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) == 
           PackageManager.PERMISSION_GRANTED && 
           ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) == 
             PackageManager.PERMISSION_GRANTED)) { 
          lm.removeUpdates(this); 
         } 
        } 
       }); 
    } 
    else { 
     lat = l.getLatitude(); 
     lng = l.getLongitude(); 
     presenter.getFoot(userProfile.getToken(),"public",lat,lng,date); 
    } 

편집 :

내가 전화 위치를 다시 작동 다시 시작하지만 난 매번이 자신의 휴대 전화를 다시 시작하기 위해 내 모든 고객에게 질수 있기 때문에 솔루션으로이을 해달라고하는 경우 문제

답변

0

사용이 클래스 : (이 기능을 사용하려면

FindGPSLocation gps; 
        gps = new FindGPSLocation(ClientsActivity.this); 
        if(gps.canGetLocation()){ 

         latitude = String.valueOf(gps.getLatitude()); 
         longitude = String.valueOf(gps.getLongitude()); 

        } 
        else 
        { 

         gps.showSettingsAlert(); 
        } 

를)

public class FindGPSLocation extends Service implements LocationListener { 

private final Context mContext; 

// flag for GPS status 
boolean isGPSEnabled = false; 

// flag for network status 
boolean isNetworkEnabled = false; 

// flag for GPS status 
boolean canGetLocation = false; 

Location location; // location 
double latitude; // latitude 
double longitude; // longitude 

// The minimum distance to change Updates in meters 
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 

// The minimum time between updates in milliseconds 
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 

// Declaring a Location Manager 
protected LocationManager locationManager; 

public FindGPSLocation(Context context) { 
    this.mContext = context; 
    getLocation(); 
} 

public Location getLocation() { 
    try { 
     locationManager = (LocationManager) mContext 
       .getSystemService(LOCATION_SERVICE); 

     // getting GPS status 
     isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 

     // getting network status 
     isNetworkEnabled = locationManager 
       .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if (!isGPSEnabled && !isNetworkEnabled) { 
      // no network provider is enabled 
     } else { 
      this.canGetLocation = true; 
      // First get location from Network Provider 
      if (isNetworkEnabled) { 
       locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 
         MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
       Log.d("Network", "Network"); 
       if (locationManager != null) { 
        location = locationManager 
          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if (location != null) { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 
      // if GPS Enabled get lat/long using GPS Services 
      if (isGPSEnabled) { 
       if (location == null) { 
        locationManager.requestLocationUpdates(
          LocationManager.GPS_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("GPS Enabled", "GPS Enabled"); 
        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return location; 
} 

/** 
* Stop using GPS listener 
* Calling this function will stop using GPS in your app 
*/ 
public void stopUsingGPS() { 
    if (locationManager != null) { 
     locationManager.removeUpdates(FindGPSLocation.this); 
    } 
} 

/** 
* Function to get latitude 
*/ 
public double getLatitude() { 
    if (location != null) { 
     latitude = location.getLatitude(); 
    } 

    // return latitude 
    return latitude; 
} 

/** 
* Function to get longitude 
*/ 
public double getLongitude() { 
    if (location != null) { 
     longitude = location.getLongitude(); 
    } 

    // return longitude 
    return longitude; 
} 

/** 
* Function to check GPS/wifi enabled 
* 
* @return boolean 
*/ 
public boolean canGetLocation() { 
    return this.canGetLocation; 
} 

/** 
* Function to show settings alert dialog 
* On pressing Settings button will lauch Settings Options 
*/ 
public void showSettingsAlert() { 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

    // Setting Dialog Title 
    alertDialog.setTitle("GPS is settings"); 

    // Setting Dialog Message 
    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

    // On pressing Settings button 
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      mContext.startActivity(intent); 
     } 
    }); 

    // on pressing cancel button 
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    // Showing Alert Message 
    alertDialog.show(); 
} 

@Override 
public void onLocationChanged(Location location) { 
} 

@Override 
public void onProviderDisabled(String provider) { 
} 

@Override 
public void onProviderEnabled(String provider) { 
} 

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

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 

}

내가 코드를 시도
+0

이것은 일반적으로 "GPSTracker"라는 이름으로 사용되는 매우 인기있는 "안티 패턴"입니다. 이것의 주된 문제는 코드가 위치 업데이트를 요청하지만 실제로 업데이트를 사용하지 않는다는 것입니다. onLocationChanged()에는 아무것도 없다. 기기가 위치 정보를 이미 알고있는 경우 첫 번째 통화에서만 작동합니다. 이러한 종류의 코드 문제에 대해서는 [Gabe Sechan의 블로그 게시물] (http://gabesechansoftware.com/location-tracking/)이 있습니다. –

+0

그래,하지만 내 코드를 onLocationChanged에 추가하면 제대로 작동하고 내 코드 에서처럼 업데이트를 제거합니다. –

+0

@MarkusKauppinen 맞습니다.하지만이 코드는 위치를 한 번 가져 오는 것입니다. 업데이트를 원할 경우 onLocationChanged()를 사용할 수 있으므로 필요하지 않습니다. – ThePunisher

-1

는 위치를 얻기 위해 타격 코드를보십시오 ... 그리고 또한 위치 서비스가 장치에서 활성화되어 있는지 확인

locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); 
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 400, 1000, this); @Override 
public void onLocationChanged(Location location) { 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 8); 
    mMap.animateCamera(cameraUpdate); 
    locationManager.removeUpdates(this); 
} 

@Override 
public void onStatusChanged(String s, int i, Bundle bundle) { 

} 

@Override 
public void onProviderEnabled(String s) { 

} 

@Override 
public void onProviderDisabled(String s) { 

} 
+0

... 여전히 같은 일을 운 ... 그래, 난 장치에서 위치 서비스가 활성화되어 있는지 확인하십시오. –

관련 문제