Làm cách nào để hiển thị hộp thoại bật vị trí như Google maps?


129

Tôi sử dụng phiên bản mới nhất của Google Play Services (7.0) và làm theo các bước được đưa ra trong hướng dẫn của họ và tôi đã bật hộp thoại vị trí như bên dưới, có nút "không bao giờ". Ứng dụng của tôi cần vị trí bắt buộc vì vậy tôi không muốn hiển thị "không bao giờ" cho người dùng, vì một khi người dùng nhấp vào "không bao giờ", tôi hoàn toàn không thể lấy lại vị trí hoặc yêu cầu vị trí.

Trường hợp như Google Maps chỉ có có và không có nút mà không có nút không bao giờ, có ý tưởng nào để đạt được điều tương tự không?

Hình ảnh ứng dụng của tôi nhập mô tả hình ảnh ở đây

Hình ảnh của Google Map nhập mô tả hình ảnh ở đây

Câu trả lời:


149

LocationSinstallRequest.Builder có một phương thức setAlwaysShow(boolean show). Mặc dù tài liệu cho biết hiện tại nó không làm gì cả (cập nhật 2015-07-05: tài liệu Google được cập nhật đã xóa từ ngữ này), cài đặt builder.setAlwaysShow(true);sẽ cho phép hành vi của Google Maps: nhập mô tả hình ảnh ở đây

Đây là mã đã làm cho nó hoạt động:

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;
            }
        }
    });
}

Từ Tài liệu Android

Đối với Kotlin xem tại đây: https://stackoverflow.com/a/61868985/12478830


1
@ MarianPaździoch khá chắc chắn rằng bạn không cần, vì mã mẫu riêng của Google trên SettingsApi không yêu cầu nó.
Kai

1
@Kai Có, mã không được sửa đổi trên Nexus 5. Sử dụng Nhật ký, tôi thấy rằng khi dịch vụ định vị ban đầu bị tắt, nó luôn luôn xuất hiện RESOLUTION_REQUIRED. Sau đó, khi tôi chấp nhận và kích hoạt vị trí, nó sẽ xuất hiện SUCCESSvà hoàn toàn bỏ qua onActivityResult(). Nhấn Nohoặc quay lại làm cho hộp thoại biến mất trong một giây, sau đó tải lại và nhấn RESOLUTION_REQUIREDlại. Cách duy nhất để thoát khỏi hộp thoại là chấp nhận hoặc đóng và mở lại ứng dụng.
pez

2
@pez đã thử nghiệm trên Galaxy S4 với các dịch vụ Google Play 7.5.74 và nó hoạt động, việc hủy không khiến cho RESOLNING_REQUIRED được gọi. Đề nghị của tôi sẽ là cập nhật các dịch vụ chơi và thử lại. Nếu thất bại, hãy bắt đầu một câu hỏi StackOverflow mới để xem những người khác có gặp phải và giải quyết vấn đề này không.
Kai

2
@Kai nó hoạt động với tôi nhưng nếu người dùng nhấn no. Làm thế nào để hiển thị lại hộp thoại hoặc thêm một số mã ở đó nếu nhấn no. Mọi trợ giúp sẽ được đánh giá cao.
Gurpreet singh

1
LƯU Ý: hoạt động của launchModebạn KHÔNG thể được đặt thành singleInstancenếu không điều này sẽ KHÔNG hoạt động. Hộp thoại sẽ không bao giờ hiển thị và onActivityResultsẽ được gọi tự động. KHÔNG CÓ android:launchMode="singleInstance"cho hoạt động của bạn trong AndroidManifest. Tôi đã học được cách rất khó khăn này sau 3 giờ
ᴛʜᴇᴘᴀᴛᴇʟ

55

Tôi muốn thêm một số thay đổi cho câu trả lời của kai cho những người đang tìm cách xử lý các nút Có / Không.

Khai báo hằng số này trong hoạt động của bạn

protected static final int REQUEST_CHECK_SETTINGS = 0x1;

gọi settingsrequest()trong onStart () của bạn

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
lấy từ tài liệu chính thức: developers.google.com/android/reference/com/google/android/gms/ tựa nếu bạn chỉ cần thêm bản đồ, để sử dụng điều này, bạn phải thêm các thư viện đó (không cần nhập toàn bộ thư viện dịch vụ chơi ): biên dịch 'com.google.android.gms: play-services-maps: 9.0.2' compile 'com.google.android.gms: play-services-location:
9.0.2

Làm thế nào để xử lý sự kiện nhấp chuột của hộp thoại này và tôi không bao giờ hiển thị nút không bao giờ trong hộp thoại
M.Yogeshwaran

xóa dòng settingsrequest () khỏi trường hợp chuyển đổi trong ActivityOnResult .. Có phải đó là những gì bạn đang hỏi ???
Veer3383

Nếu tôi nhấp vào nút không có hộp thoại, hộp thoại đó sẽ xuất hiện liên tục .. Tôi đã xóa dòng settingsrequest () khỏi trường hợp chuyển đổi trong ActivityOnResult .. thì tại sao nó lại hiển thị liên tục?
Asmi

Có thể bạn cần dọn dẹp xây dựng dự án.
Veer3383

25

LocationService.SinstallApi hiện không được chấp nhận, vì vậy chúng tôi sử dụng 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);

Sau đó kiểm tra xem cài đặt vị trí hiện tại có hài lòng không. Tạo tác vụ LocationSinstallResponse:

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

Sau đó thêm Listener

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;
                            }
                        }
                    }
                });

Đã thêm 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;
        }
    }

Tham khảo liên kết SettingsClient


1
Kiểm tra stackoverflow.com/a/53277287 @BadLoser bằng SettingsClient
Ketan Ramani

Tên của phụ thuộc để nhập khẩu là gì? Không thể giải quyết biểu tượng Nhiệm vụ.
Denis

Tôi đã tìm thấy nó: triển khai 'com.google.android.gms: play-services-task: 16.0.1'
Denis

@Denis, tôi có thể sử dụng implementation 'com.google.android.gms:play-services-location:16.0.0'thay thế.
CoolMind

25

Nó hoạt động tương tự như google maps?
Mã nguồn: https://drive.google.com/open?id=0BzBKpZ4nzNzUOXM2eEhHM3hOZk0

Thêm phụ thuộc vào tệp build.gradle:

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

HOẶC LÀ

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

nhập mô tả hình ảnh ở đây

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;
                    }
                }
            });
        }
    }

}

đó là niềm vui của tôi
Keshav Gera

1
Xem Bài phát của Người nhận Phát sóng Rất hữu ích và Giống như tôi stackoverflow.com/questions/15698790/
triệt

Giải pháp hoàn hảo.
Lalit Sharma

Cảm ơn Lalit Sharma
Keshav Gera

Bạn có thể vui lòng cập nhật liên kết không, bây giờ nó đã bị hỏng, hãy đăng mã trong GitHub
Manoj Perumarath

7

Ola Cabs đang sử dụng API Cài đặt mới được phát hành để đạt được chức năng này. Theo API mới, người dùng không bắt buộc phải điều hướng đến trang cài đặt để cho phép các dịch vụ định vị cung cấp tích hợp liền mạch cho cùng. Vui lòng đọc bên dưới để biết thêm chi tiết:

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


Điều này trông giống như câu trả lời veer3383. vui lòng sửa cho tôi nếu tôi sai
rakesh kashyap

@rakeshkashyap vâng, nó giống nhau
MatPag

Tôi muốn biết nếu có thể thực hiện các thao tác dưới đây: * đặt thời gian chờ để nhận vị trí. * kiểm tra API cài đặt GPS, nếu tất cả các cảm biến cần thiết được bật và hiển thị thông báo tương ứng. * Nếu điều này là có thể, làm thế nào để thiết lập thời gian chờ.? Tôi không thể tìm thấy bất kỳ cài đặt nào như vậy khi xây dựng API
rakesh kashyap

Xin chào, tôi gặp sự cố với việc tải bản đồ lần thứ hai sau khi bật GPS từ trạng thái Tắt, xin vui lòng, mọi người giúp tôi với: stackoverflow.com/questions/44368960/ cảm ơn.
Jaimin Modi

3
SettingsAPIđã bị từ chối, bây giờ bạn sử dụng SettingsClient developers.google.com/android/reference/com/google/android/gms/
mẹo

7

Phụ thuộc

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

Bạn cũng có thể thêm một số LocationRequests cho Builder để đạt được hộp thoại "Sử dụng GPS, Wi-Fi và mạng di động cho vị trí" thay vì chỉ "Sử dụng GPS cho vị trí"

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());

Trong trường hợp của tôi, sử dụng PRIORITY_HIGH_ACCURACY là đủ để nhận câu "Sử dụng GPS, Wi-Fi và mạng di động cho vị trí". Nhưng điều kỳ lạ là nó hoạt động trên thiết bị thực nhưng trong trình giả lập thì không. Trong câu giả lập luôn luôn không có "Sử dụng GPS" khi bắt đầu mặc dù tôi thấy thiết bị giả lập đó có GPS.
mikep

0

Trong Kotlin, sử dụng mã này:

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

Vui lòng kiểm tra giải pháp rất đơn giản của tôi để có được vị trí người dùng ở phía trước.

  1. Hộp thoại Cài đặt GPS
  2. Vị trí người dùng với dữ liệu trực tiếp.
  3. Lớp LocationUtility là vòng đời hoạt động nhận biết để tạm dừng / tiếp tục cập nhật vị trí.
  4. Vị trí với FuseLocationProviderClient mới nhất

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

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.