android - 정보 - 내 위치 설정 변경




Android에서 프로그래밍 방식으로 현재 GPS 위치를 얻으려면 어떻게해야하나요? (14)

GPS 위치 정보 가져 오기 -

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

LocationListener locationListener = new LocationListener() 
{

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProviderEnabled(String provider) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onProviderDisabled(String provider) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onLocationChanged(Location location) {
                // TODO Auto-generated method stub
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                double speed = location.getSpeed(); //spedd in meter/minute
                speed = (speed*3600)/1000;      // speed in km/minute               Toast.makeText(GraphViews.this, "Current speed:" + location.getSpeed(),Toast.LENGTH_SHORT).show();
            }
        };

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

}

프로그래밍 방식으로 GPS를 사용하여 현재 위치를 가져와야합니다. 나는 그것을 어떻게 성취 할 수 있는가?


다른 답변에 대한 추가 정보가 있습니다.

Android는

GPS_PROVIDER and NETWORK_PROVIDER

onLocationChanged(Location location) 에서 가져 오기 이벤트를 두 개에서 동시에 시작할 수 있습니다. 여태까지는 그런대로 잘됐다. 이제 우리는 두 가지 결과가 필요하거나 최선을 다해야합니다. GPS_PROVIDER 결과가 NETWORK_PROVIDER 보다 더 정확합니다.

Location 필드를 정의합시다.

private Location currentBestLocation = null;

위치 변경을 시작하기 전에 다음 메소드를 구현합니다. 이 메소드는 GPS와 네트워크 사이의 마지막 위치를 반환합니다. 이 방법을 사용하는 것이 가장 좋습니다.

/**
 * @return the last know best location
 */
private Location getLastBestLocation() {
    Location locationGPS = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    Location locationNet = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

    long GPSLocationTime = 0;
    if (null != locationGPS) { GPSLocationTime = locationGPS.getTime(); }

    long NetLocationTime = 0;

    if (null != locationNet) {
        NetLocationTime = locationNet.getTime();
    }

    if ( 0 < GPSLocationTime - NetLocationTime ) {
        return locationGPS;
    }
    else {
        return locationNet;
    }
}

새로운 위치를 검색 할 때마다 이전 위치와 비교할 것입니다.

...
static final int TWO_MINUTES = 1000 * 60 * 2;
...

onLocationChanged 새 메서드를 추가합니다.

@override
public void onLocationChanged(Location location) {

    makeUseOfNewLocation(location);

    if(currentBestLocation == null){
        currentBestLocation = location;
    }

    ....
}


/**
 * This method modify the last know good location according to the arguments.
 *
 * @param location The possible new location.
 */
void makeUseOfNewLocation(Location location) {
    if ( isBetterLocation(location, currentBestLocation) ) {
        currentBestLocation = location;
    }
}

....

/** Determines whether one location reading is better than the current location fix
 * @param location  The new location that you want to evaluate
 * @param currentBestLocation  The current location fix, to which you want to compare the new one.
 */
protected boolean isBetterLocation(Location location, Location currentBestLocation) {
    if (currentBestLocation == null) {
        // A new location is always better than no location
        return true;
    }

    // Check whether the new location fix is newer or older
    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
    boolean isNewer = timeDelta > 0;

    // If it's been more than two minutes since the current location, use the new location,
    // because the user has likely moved.
    if (isSignificantlyNewer) {
        return true;
        // If the new location is more than two minutes older, it must be worse.
    } else if (isSignificantlyOlder) {
        return false;
    }

    // Check whether the new location fix is more or less accurate
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // Check if the old and new location are from the same provider
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
                                                currentBestLocation.getProvider());

    // Determine location quality using a combination of timeliness and accuracy
    if (isMoreAccurate) {
        return true;
    } else if (isNewer && !isLessAccurate) {
        return true;
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
        return true;
    }
    return false;
}

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
    if (provider1 == null) {
        return provider2 == null;
    }
    return provider1.equals(provider2);
}

....

이미 많은 해답이 있지만 Google API를 사용하여 위치를 가져 오는 최신 방법을 보여주고 싶기 때문에 새로운 프로그래머는 새로운 방법을 사용할 수 있습니다.

내 블로그 demonuts.com 에서 안드로이드의 현재 위치에 대한 자세한 자습서를 작성했습니다. 또한 Android Studio로 개발 된 전체 소스 코드를 찾을 수 있습니다.

우선,이 파일을 gradle 파일에 넣으십시오.

 compile 'com.google.android.gms:play-services:9.0.2'

필요한 인터페이스를 구현한다.

public class MainActivity  extends BaseActivitiy implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener

인스턴스 선언

  private GoogleApiClient mGoogleApiClient;
  private Location mLocation;
  private LocationManager locationManager;
  private LocationRequest mLocationRequest;

이것을 onCreate() 에 넣으십시오.

 mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

마지막으로, 필요한 메소드를 오버라이드 (override)합니다.

 @Override
    public void onConnected(Bundle bundle) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        } startLocationUpdates();
        mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if(mLocation == null){
            startLocationUpdates();
        }
        if (mLocation != null) {
            double latitude = mLocation.getLatitude();
            double longitude = mLocation.getLongitude();
        } else {
            // Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
        }
    }

    protected void startLocationUpdates() {
        // Create the location request
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(UPDATE_INTERVAL)
                .setFastestInterval(FASTEST_INTERVAL);
        // Request location updates
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                mLocationRequest, this);
        Log.d("reque", "--->>>>");
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "Connection Suspended");
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i(TAG, "Connection failed. Error: " + connectionResult.getErrorCode());
    }

    @Override
    public void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }
    @Override
    public void onLocationChanged(Location location) {

    }

앱을 실행하기 전에 기기에서 GPS를 시작하는 것을 잊지 마십시오.


최신 / 최신 버전을 사용해야합니다.

GoogleApiClient Api

기본적으로해야 할 일은 다음과 같습니다.

private GoogleApiClient mGoogleApiClient;
mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

그때

@Override
    public void onConnected(Bundle connectionHint) {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {
            mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
            mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
        }
    }

가장 정확하고 신뢰할 수있는 위치. 여기 내 게시물보기 :

https://.com/a/33599228/2644905

정확하지 않고 응답이 지연된 LocationListener를 사용하지 마십시오. 솔직히 구현하기가 더 쉽습니다. 설명서 ( https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient


Google Play 위치 서비스 가 제공되었으므로 개발자는 새로운 통합 위치 제공 업체를 사용하는 것이 좋습니다. 사용하기가 쉽고 정확합니다. 새로운 Google Play 위치 서비스 API를 만든 두 사람이 Google I / O 동영상 인 블루 닷 너머 : Android 위치의 새로운 기능을 시청하시기 바랍니다.

여러 모바일 플랫폼에서 위치 API를 사용하여 작업 해 왔으며이 두 사람의 작업이 실제로 혁명적이라고 생각합니다. 그것은 다양한 공급자를 사용하는 엄청난 양의 복잡성을 제거합니다. 스택 오버플로는 사용할 공급자, 마지막으로 알려진 위치를 사용할지 여부, LocationManager에서 다른 속성을 설정하는 방법 등에 대해 질문이 깔려 있습니다.이 새 API는 이러한 불확실성의 대부분을 제거하고 위치 서비스를 즐겁게 만듭니다. 용도.

필자는 Google Play 위치 서비스를 사용하여 주기적으로 위치 정보를 가져 와서 데이터베이스에 저장되고 Google지도에서 볼 수있는 위치에 웹 서버에 위치 정보를 전송하는 Android 앱을 작성했습니다. 클라이언트 소프트웨어 (Android, iOS, Windows Phone 및 Java ME 용 )와 서버 소프트웨어 (ASP.NET 및 SQL Server 또는 PHPMySQL )를 모두 작성했습니다. 이 소프트웨어는 각 플랫폼의 모국어로 작성되었으며 각각의 배경에서 올바르게 작동합니다. 마지막으로, 소프트웨어에는 MIT 라이센스가 있습니다. Android 클라이언트는 다음 위치에서 찾을 수 있습니다.

https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android


GoogleSamples 에는 최신 FusedLocationProviderApi를 사용하는 자세한 예제가 있습니다. 불행히도 가장 upvoted 대답은 구식입니다.

아래 예제를 따라 FusedLocationProviderApi를 사용하여 위치 서비스를 구현하십시오.

https://github.com/googlesamples/android-play-location/tree/master/LocationUpdates

https://github.com/googlesamples/android-play-location/blob/master/LocationUpdates/app/src/main/java/com/google/android/gms/location/sample/locationupdates/MainActivity.java


LocationManager는 마지막에 알고있는 위치를 얻는 빌드 메소드를 제공하는 클래스입니다.

1 단계 : 아래와 같이 LocationManager 객체를 생성하십시오.

LocationManager locationManager = (위치 관리자) context.getSystemService (Context.LOCATION_SERVICE);

2 단계 : 기준 추가

*Criteria is use for setting accuracy*

Criteria criteria = new Criteria();
int currentapiVersion = android.os.Build.VERSION.SDK_INT;

if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) {

    criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setAltitudeRequired(true);
    criteria.setBearingRequired(true);
    criteria.setSpeedRequired(true);

}

3 단계 : 유효한 공급자를 얻으십시오

Threre는 두 가지 유형의 제공 업체 GPS 및 네트워크입니다.

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

4 단계 : 가장 최근 위치 파악

Location location = locationManager.getLastKnownLocation(provider);

5 단계 : 위도 및 경도 가져 오기

location 객체가 null 인 경우, 메소드 아래에서 호출을 시도하지 않습니다.

getLatitude and getLongitude is methods which returns double values


가장 간단한 방법을 찾을 수 있습니다.

   package com.javapapers.android.geolocationfinder;

    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Context;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.widget.TextView;

    import android.util.Log;

    public class MainActivity extends Activity implements LocationListener{
    protected LocationManager locationManager;
    protected LocationListener locationListener;
    protected Context context;
    TextView txtLat;
    String lat;
    String provider;
    protected String latitude,longitude; 
    protected boolean gps_enabled,network_enabled;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtLat = (TextView) findViewById(R.id.textview1);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    }
    @Override
    public void onLocationChanged(Location location) {
    txtLat = (TextView) findViewById(R.id.textview1);
    txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
    }

    @Override
    public void onProviderDisabled(String provider) {
    Log.d("Latitude","disable");
    }

    @Override
    public void onProviderEnabled(String provider) {
    Log.d("Latitude","enable");
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    Log.d("Latitude","status");
    }
    }

Android에서 위치 데이터를 쉽게 가져올 수있는 작은 라이브러리를 게시했으며 Android M 런타임 권한도 처리합니다.

여기에서 확인할 수 있습니다 : https://github.com/julioromano/RxLocation 및 구현을위한 예제로 소스 코드 또는 소스 코드를 사용하십시오.


Getting location updates requires lots of bolierplate code in Android, You need to take care of

  • Google Play services availablity Check,
  • Update Google play Service if it is old or not available
  • Dialog Creation of GoogleApiClient and its callbacks connected,disconnected etc.
  • Stopping and releasing resources for location updates
  • Handling Location permission scenarios
  • Checking Location services are On or Off
  • Getting lastknown location is not so easy either
  • Fallback to last known location if not getting location after certain duration

To ease out all these steps i have created Android-EasyLocation (small android library) which will take care all this stuff and you can focus on business logic.

All you need is extend EasyLocationActivity and this

requestSingleLocationFix(easyLocationRequest);

또는

requestLocationUpdates(easyLocationRequest);

Checkout sample app and steps needed here at https://github.com/akhgupta/Android-EasyLocation


간단하고 쉬운 방법,

https://github.com/sachinvarma/EasyLocation 사용하여 위치 정보를 가져 https://github.com/sachinvarma/EasyLocation .

1 단계 : 그냥 전화하기.

new EasyLocationInit(MainActivity.this, timeInterval, fastestTimeInterval, runAsBackgroundService);

timeInterval -> setInterval (long) (inMilliSeconds) - 위치를 가져올 간격을 설정합니다.

fastestTimeInterval -> setFastestInterval (long) (inMilliSeconds) - 위치를 더 빨리 얻을 수 있다면 가져올 수 있습니다. (즉, 다른 앱이 위치 서비스를 사용하고 있습니다).

runAsBackgroundService = True -> (서비스가 백그라운드에서 실행되고 (timeInterval 및 fastestTimeInterval에 따라) 빈번하게 업데이트 됨) runAsBackgroundService = False -> (성공적인 위치 업데이트 후 서비스가 getDestroyed 됨)

2 단계 : EventBus 가입자 준비 : 구독 방법 선언 및 주석 달기, 선택적으로 스레드 모드 지정 :

예 :

     @Override
     public void onStart() {
         super.onStart();
         EventBus.getDefault().register(this);
     }

     @Override
     public void onStop() {
         super.onStop();
         EventBus.getDefault().unregister(this);
     }

  @SuppressLint("SetTextI18n")
  @Subscribe
  public void getEvent(final Event event) {

    if (event instanceof LocationEvent) {
      if (((LocationEvent) event).location != null) {
        ((TextView) findViewById(R.id.tvLocation)).setText("The Latitude is "
          + ((LocationEvent) event).location.getLatitude()
          + " and the Longitude is "
          + ((LocationEvent) event).location.getLongitude());
      }
    }
  }

그게 다야.

미래에 도움이되기를 바랍니다.


스마트 위치 라이브러리 사용을 권장합니다. 사용
하기가 매우 쉽고 위치 로직을 멋지게 감쌀 수 있습니다.

위치 서비스 시작 :

SmartLocation.with(context).location()
    .start(new OnLocationUpdatedListener() { ... });

단일 위치 (주기적이 아닌)를 얻으려면 oneFix 한정자를 사용할 수 있습니다. 예:

SmartLocation.with(context).location()
    .oneFix()
    .start(new OnLocationUpdatedListener() { ... });

Android 용 새 위치 프로젝트를 만드는 경우 새로운 Google Play 위치 서비스를 사용해야합니다 . 사용법이 훨씬 정확하고 훨씬 간단합니다.

저는 오픈 소스 GPS 트래커 프로젝트 인 GpsTracker를 몇 년 동안 사용해 왔습니다. 최근 Android, iOS, Windows Phone 및 Java ME 휴대 전화의 정기 업데이트를 처리하도록 업데이트했습니다 . 그것은 완벽하게 작동하며 필요한 것을 수행하며 MIT 라이센스를 가지고 있습니다.

GpsTracker의 Android 프로젝트는 새로운 Google Play 서비스를 사용하며, 두 개의 서버 스택 ( ASP.NETPHP )을 사용하여 해당 전화를 추적 할 수 있습니다.


위치 확인을 위해서 다음 코드를 사용할 수 있습니다. 주 활동의 onStart ()에 넣을 수 있으며 false가 반환되면 경고 대화 상자를 표시 할 수 있습니다.

private boolean isLocationAccurate()
    {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
        {
            String provider = Settings.Secure
                    .getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            if (provider != null && !provider.contains("gps"))
            {
                return false;
            }
        }
        else
        {
            try
            {
                int status = Settings.Secure
                        .getInt(this.getContentResolver(), Settings.Secure.LOCATION_MODE);
                if (status != Settings.Secure.LOCATION_MODE_HIGH_ACCURACY)
                {
                    return false;
                }
            }
            catch (Settings.SettingNotFoundException e)
            {
                Log.e(TAG, e.getMessage());
            }
        }

        return true;
    }




location