Google지도와 같은 위치 활성화 대화 상자를 표시하는 방법


129

최신 버전의 Google Play 서비스 (7.0)를 사용하고 가이드에 제공된 단계를 따르고 "never"버튼이있는 아래와 같은 위치 대화 상자를 활성화했습니다. 사용자가 "never"를 클릭하면 위치를 얻거나 위치를 다시 요청할 수 없기 때문에 내 앱에는 위치가 필요하므로 사용자에게 "never"를 표시하고 싶지 않습니다.

Google지도에 예 버튼 만 있고 버튼이없는 버튼이없는 경우 동일한 방법을 사용하는 방법을 알고 있습니까?

내 앱의 이미지 여기에 이미지 설명을 입력하십시오

구글 맵의 이미지 여기에 이미지 설명을 입력하십시오

답변:


149

LocationSettingsRequest.Builder 에는 메소드가 setAlwaysShow(boolean show)있습니다. 문서에 현재 아무 것도 수행하고 있지 않다고 표시되어 있지만 (2015-07-05 업데이트 : Google 문서 업데이트로이 문구가 제거됨) 설정 builder.setAlwaysShow(true);하면 Google지도 동작이 활성화됩니다. 여기에 이미지 설명을 입력하십시오

작동하는 코드는 다음과 같습니다.

if (googleApiClient == null) {
    googleApiClient = new GoogleApiClient.Builder(getActivity())
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();
    googleApiClient.connect();

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    //**************************
    builder.setAlwaysShow(true); //this is the key ingredient
    //**************************

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                getActivity(), 1000);
                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    break;
            }
        }
    });
}

안드로이드 문서에서

Kotlin의 경우 https://stackoverflow.com/a/61868985/12478830을 참조하십시오.


1
@ MarianPaździoch는 SettingsApi의 Google 자체 샘플 코드가 필요하지 않기 때문에 필요하지 않습니다.
Kai

1
@Kai 예, Nexus 5에서 코드가 수정되지 않았습니다. 로그를 사용하면 위치 서비스가 처음에 꺼져있을 때 항상 충돌 RESOLUTION_REQUIRED합니다. 그런 다음 위치를 수락하고 활성화하면을 (를 SUCCESS) 누르고 완전히 건너 뜁니다 onActivityResult(). No또는 뒤로를 누르면 대화 상자가 잠시 사라지고 다시로드 한 후 다시칩니다 RESOLUTION_REQUIRED. 대화 상자를 제거하는 유일한 방법은 앱을 수락하거나 닫았다가 다시 여는 것입니다.
pez

2
@pez는 Google Play 서비스 7.5.74로 Galaxy S4에서 테스트되었으며 작동하지만 취소해도 RESOLUTION_REQUIRED가 호출되지 않습니다. 내 제안은 놀이 서비스를 업데이트하고 다시 시도하는 것입니다. 실패하면 새 StackOverflow 질문을 시작하여 다른 사람들이이 문제를 발견하고 해결했는지 확인하십시오.
Kai

2
@ 카이 그것은 나를 위해 일했지만 사용자가 아니오를 누르면 어떻게됩니까? 아니면 대화 상자를 다시 표시하거나 아니오를 누르면 코드를 추가하는 방법 어떤 도움을 주시면 감사하겠습니다.
Gurpreet singh

1
참고 : 활동을 launchMode설정할 수 없습니다 singleInstance. 그렇지 않으면 작동하지 않습니다. 대화 상자가 표시되지 않으며 onActivityResult자동으로 호출됩니다. android:launchMode="singleInstance"에서 활동 하지 마십시오 AndroidManifest. 나는 3 시간 후에 매우 어려운 방법을 배웠습니다
ᴛʜᴇᴘᴀᴛᴇʟ

55

예 / 아니요 버튼을 처리하려는 사람들의 카이 답변에 변경 사항을 추가하고 싶습니다.

활동 에서이 상수를 선언하십시오.

protected static final int REQUEST_CHECK_SETTINGS = 0x1;

settingsrequest()onStart ()를 호출 하십시오.

public void settingsrequest()
    {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true); //this is the key ingredient

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult result) {
                final Status status = result.getStatus();
                final LocationSettingsStates state = result.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location
                        // requests here.
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied. But could be fixed by showing the user
                        // a dialog.
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
                        break;
                }
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        startLocationUpdates();
                        break;
                    case Activity.RESULT_CANCELED:
                        settingsrequest();//keep asking if imp or do whatever
                        break;
                }
                break;
        }
    }

1
공식 문서에서 제공합니다 : developers.google.com/android/reference/com/google/android/gms/… 지도 만 추가해야하는 경우이를 사용하려면 전체 플레이 서비스 라이브러리를 가져 오지 않고 해당 라이브러리를 추가해야합니다 ) : 컴파일 'com.google.android.gms : 플레이 서비스 - 매핑 : 9.0.2'컴파일 'com.google.android.gms : 플레이 서비스 - 위치 : 9.0.2'
MatPag

이 대화 상자의 클릭 이벤트를 처리하는 방법 대화 상자에 절대 버튼을 표시하지 않아야 함
M.Yogeshwaran

ActivityOnResult의 스위치 케이스에서 settingsrequest () 줄을 제거하십시오.
Veer3383

대화 상자의 아무 버튼도 클릭하지 않아도 대화 상자가 계속 나타납니다. ActivityOnResult.의 스위치 케이스에서 settingsrequest () 줄을 이미 제거했습니다. 왜 계속 표시됩니까?
Asmi

프로젝트를 깨끗하게 빌드해야 할 수도 있습니다.
Veer3383

25

LocationServices.SettingsApi는 더 이상 사용되지 않으므로 SettingsClient를 사용합니다.

    LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10);
        mLocationRequest.setSmallestDisplacement(10);
        mLocationRequest.setFastestInterval(10);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new 
        LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);

그런 다음 현재 위치 설정이 만족되는지 확인하십시오. LocationSettingsResponse 태스크를 작성하십시오.

        Task<LocationSettingsResponse> task=LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());

그런 다음 리스너를 추가하십시오.

task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
                    public void onComplete(Task<LocationSettingsResponse> task) {
                        try {
                            LocationSettingsResponse response = task.getResult(ApiException.class);
                            // All location settings are satisfied. The client can initialize location
                            // requests here.

                        } catch (ApiException exception) {
                            switch (exception.getStatusCode()) {
                                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                    // Location settings are not satisfied. But could be fixed by showing the
                                    // user a dialog.
                                    try {
                                        // Cast to a resolvable exception.
                                        ResolvableApiException resolvable = (ResolvableApiException) exception;
                                        // Show the dialog by calling startResolutionForResult(),
                                        // and check the result in onActivityResult().
                                        resolvable.startResolutionForResult(
                                                HomeActivity.this,
                                                101);
                                    } catch (IntentSender.SendIntentException e) {
                                        // Ignore the error.
                                    } catch (ClassCastException e) {
                                        // Ignore, should be an impossible error.
                                    }
                                    break;
                                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                    // Location settings are not satisfied. However, we have no way to fix the
                                    // settings so we won't show the dialog.
                                    break;
                            }
                        }
                    }
                });

onActivityResult 추가

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case 101:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        Toast.makeText(HomeActivity.this,states.isLocationPresent()+"",Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(HomeActivity.this,"Canceled",Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                break;
        }
    }

SettingsClient 링크를 참조하십시오


1
확인 stackoverflow.com/a/53277287 @BadLoser 사용 SettingsClient을
케탄 마니에게

가져올 종속성의 이름은 무엇입니까? 기호 작업을 해결할 수 없습니다.
Denis

나는 그것을 발견 구현 'com.google.android.gms : 플레이 서비스 - 작업 : 16.0.1'
데니스를

@Denis, implementation 'com.google.android.gms:play-services-location:16.0.0'대신 사용할 수 있습니다 .
CoolMind

25

구글 맵과 유사합니까?
소스 코드 : https://drive.google.com/open?id=0BzBKpZ4nzNzUOXM2eEhHM3hOZk0

build.gradle 파일에 종속성을 추가하십시오.

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

또는

compile 'com.google.android.gms:play-services-location:10.0.1'

여기에 이미지 설명을 입력하십시오

public class LocationOnOff_Similar_To_Google_Maps extends AppCompatActivity {

    protected static final String TAG = "LocationOnOff";


    private GoogleApiClient googleApiClient;
    final static int REQUEST_LOCATION = 199;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.setFinishOnTouchOutside(true);

        // Todo Location Already on  ... start
        final LocationManager manager = (LocationManager) LocationOnOff_Similar_To_Google_Maps.this.getSystemService(Context.LOCATION_SERVICE);
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
            finish();
        }
        // Todo Location Already on  ... end

        if(!hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)){
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not Supported",Toast.LENGTH_SHORT).show();
        }

        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not enabled",Toast.LENGTH_SHORT).show();
            enableLoc();
        }else{
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
        }
    }


    private boolean hasGPSDevice(Context context) {
        final LocationManager mgr = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        if (mgr == null)
            return false;
        final List<String> providers = mgr.getAllProviders();
        if (providers == null)
            return false;
        return providers.contains(LocationManager.GPS_PROVIDER);
    }

    private void enableLoc() {

        if (googleApiClient == null) {
            googleApiClient = new GoogleApiClient.Builder(LocationOnOff_Similar_To_Google_Maps.this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                        @Override
                        public void onConnected(Bundle bundle) {

                        }

                        @Override
                        public void onConnectionSuspended(int i) {
                            googleApiClient.connect();
                        }
                    })
                    .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                        @Override
                        public void onConnectionFailed(ConnectionResult connectionResult) {

                            Log.d("Location error","Location error " + connectionResult.getErrorCode());
                        }
                    }).build();
            googleApiClient.connect();

            LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            locationRequest.setInterval(30 * 1000);
            locationRequest.setFastestInterval(5 * 1000);
            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest);

            builder.setAlwaysShow(true);

            PendingResult<LocationSettingsResult> result =
                    LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
            result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                @Override
                public void onResult(LocationSettingsResult result) {
                    final Status status = result.getStatus();
                    switch (status.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            try {
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                status.startResolutionForResult(LocationOnOff_Similar_To_Google_Maps.this, REQUEST_LOCATION);

                                finish();
                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            }
                            break;
                    }
                }
            });
        }
    }

}

그것은 나의 기쁨이다
Keshav Gera

1
참고 방송 수신기 포스트 매우 유용하고 같은 날 stackoverflow.com/questions/15698790/...
Keshav 게라

완벽한 솔루션.
Lalit Sharma

감사합니다 Lalit Sharma
Keshav Gera

링크를 업데이트하십시오. 링크가 깨졌습니다. 대신 GitHub에 코드를 게시하십시오
Manoj Perumarath

7

Ola Cabs는이 기능을 달성하기 위해 새로 출시 된 설정 API를 사용하고 있습니다. 새로운 API에 따라 사용자는 위치 서비스를 활성화하기 위해 설정 페이지로 이동할 필요가 없으며 동일한 통합을 제공합니다. 자세한 내용은 아래를 참조하십시오.

https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi


이것은 veer3383 답변과 동일하게 보입니다. 메신저 잘못된 경우에 나를 수정
rakesh kashyap

@rakeshkashyap 그렇습니다
MatPag

다음을 수행 할 수 있는지 알고 싶었습니다. * 위치를 얻기 위해 시간 초과를 설정하십시오. * 필요한 모든 센서가 활성화되어 있으면 GPS 설정 API를 확인하고 그에 따라 메시지를 표시하십시오. * 이것이 가능한 경우 시간 초과를 설정하는 방법은 무엇입니까? API를 빌드 할 때 이러한 설정을 찾을 수 없었습니다
rakesh kashyap

안녕하세요, GPS를 끈 상태에서 두 번째로 맵을로드하는 데 문제가 있습니다. 누구든지 도와주세요 : stackoverflow.com/questions/44368960/… 감사합니다.
Jaimin Modi

3
SettingsAPI더 이상 사용되지 않습니다. 이제 SettingsClient developers.google.com/android/reference/com/google/android/gms/…
Saik Caskey

7

의존

compile 'com.google.android.gms:play-services-location:10.0.1'

암호

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    public static final int REQUEST_LOCATION=001;

    GoogleApiClient googleApiClient;

    LocationManager locationManager;
    LocationRequest locationRequest;
    LocationSettingsRequest.Builder locationSettingsRequest;
    Context context;


    PendingResult<LocationSettingsResult> pendingResult;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Toast.makeText(this, "Gps is Enabled", Toast.LENGTH_SHORT).show();

        } else {
            mEnableGps();
        }

    }

    public void mEnableGps() {
        googleApiClient = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API).addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        googleApiClient.connect();
        mLocationSetting();
    }

    public void mLocationSetting() {
        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(1 * 1000);
        locationRequest.setFastestInterval(1 * 1000);

        locationSettingsRequest = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);

        mResult();

    }

    public void mResult() {
        pendingResult = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, locationSettingsRequest.build());
        pendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                Status status = locationSettingsResult.getStatus();


                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location
                        // requests here.

                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

                        try {

                            status.startResolutionForResult(MainActivity.this, REQUEST_LOCATION);
                        } catch (IntentSender.SendIntentException e) {

                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.


                        break;
                }
            }

        });
    }


    //callback method
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case REQUEST_LOCATION:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        Toast.makeText(context, "Gps enabled", Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(context, "Gps Canceled", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                break;
        }
    }


    @Override
    public void onConnected(@Nullable Bundle bundle) {

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}

4

"위치에 GPS 사용"대신 "위치에 GPS, Wi-Fi 및 모바일 네트워크 사용"대화 상자를 생성하기 위해 Builder에 여러 개의 LocationRequests를 추가 할 수도 있습니다.

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY))
                .addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_HIGH_ACCURACY))
                .setAlwaysShow(true);

PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

제 경우에는 PRIORITY_HIGH_ACCURACY를 사용하여 "위치에 GPS, Wi-Fi 및 모바일 네트워크 사용"이라는 문장을 얻는 것으로 충분합니다. 그러나 실제 장치에서는 작동하지만 시뮬레이터에서는 작동하지 않는 것이 이상합니다. 시뮬레이터 문장에는 시뮬레이터 장치에 GPS가 있지만 시작시 항상 "GPS 사용"이 없습니다.
mikep

0

Kotlin에서 다음 코드를 사용하십시오.

import android.app.Activity
import android.content.Intent
import android.content.IntentSender
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.common.api.PendingResult
import com.google.android.gms.common.api.Status
import com.google.android.gms.location.*

class MainActivity : AppCompatActivity() {
    private var googleApiClient: GoogleApiClient? = null
    private val REQUESTLOCATION = 199
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableLoc()
    }
    private fun enableLoc() {
        googleApiClient = GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
                override fun onConnected(bundle: Bundle?) {}
                override fun onConnectionSuspended(i: Int) {
                    googleApiClient?.connect()
                }
            })
            .addOnConnectionFailedListener {
            }.build()
        googleApiClient?.connect()
        val locationRequest = LocationRequest.create()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 30 * 1000.toLong()
        locationRequest.fastestInterval = 5 * 1000.toLong()
        val builder = LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest)
        builder.setAlwaysShow(true)
        val result: PendingResult<LocationSettingsResult> =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
        result.setResultCallback { result ->
            val status: Status = result.status
            when (status.statusCode) {
                LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> try {
                    status.startResolutionForResult(
                        this@MainActivity,
                        REQUESTLOCATION
                    )
                } catch (e: IntentSender.SendIntentException) {
                }
            }
        }
    }
    override fun onActivityResult(
        requestCode: Int,
        resultCode: Int,
        data: Intent?
    ) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            REQUESTLOCATION -> when (resultCode) {
                Activity.RESULT_OK -> Log.d("abc","OK")
                Activity.RESULT_CANCELED -> Log.d("abc","CANCEL")
            }
        }
    }
}

0

포 그라운드에서 사용자 위치를 얻으려면 매우 간단한 솔루션을 확인하십시오.

  1. GPS 설정 대화 상자
  2. 실시간 데이터가있는 사용자 위치.
  3. LocationUtility 클래스는 위치 업데이트를 일시 중지 / 다시 시작하는 활동 수명주기입니다.
  4. 최신 FusedLocationProviderClient 가있는 위치

https://github.com/Maqsood007/UserLocation-Android/blob/master/app/src/main/java/jetpack/skill/userlocation_android/utils/LocationUtility.kt

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.