Bật dịch vụ vị trí mà không cần điều hướng đến trang cài đặt


121

Chống lại cách tiếp cận truyền thống là nhắc người dùng truy cập trang cài đặt và bật dịch vụ định vị và quay lại lần nữa, tôi đã nhận thấy một cách đơn giản hơn để làm điều tương tự trong một số ứng dụng mới nhất.

Đề cập đến ảnh chụp màn hình bên dưới, nó sẽ nhắc một hộp thoại để người dùng bật dịch vụ định vị chỉ bằng một cú nhấp chuột và nó hoạt động trong các ứng dụng đó.

Làm thế nào tôi có thể đạt được điều tương tự?

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


13
(Những) cử tri tiêu cực có thể cung cấp lý do không?
GAMA

3
Cảm ơn bạn đã đặt câu hỏi này. Up bình chọn
Lokesh Pandey

@GAMA Đây là cách hoạt động của stackoverflow! Mọi người không cần lý do để bỏ phiếu. Như một cộng đồng thù địch và tuyệt vời cùng một lúc!

Câu trả lời:


150

Hộp thoại này được tạo bởi LocationSettingsRequest.Builder có sẵn trong Dịch vụ của Google Play.

Bạn cần thêm phần phụ thuộc vào ứng dụng của mình build.gradle:

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

Sau đó, bạn có thể sử dụng ví dụ tối thiểu này:

private void displayLocationSettingsRequest(Context context) {
    GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
            .addApi(LocationServices.API).build();
    googleApiClient.connect();

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(10000 / 2);

    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.SUCCESS:
                    Log.i(TAG, "All location settings are satisfied.");
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");

                    try {
                        // Show the dialog by calling startResolutionForResult(), and check the result
                        // in onActivityResult().
                        status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                    } catch (IntentSender.SendIntentException e) {
                        Log.i(TAG, "PendingIntent unable to execute request.");
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
                    break;
            }
        }
    });
}

Bạn có thể tìm thấy ví dụ đầy đủ ở đây .


1
Tôi xin lỗi nhưng tôi không hiểu hai dòng đầu tiên:You need to add a dependency to your app build.gradle: compile 'com.google.android.gms:play-services:8.1.0'
GAMA

Bạn có thể tìm thêm thông tin về cách thiết lập Dịch vụ Google Play tại đây
Mattia Maestrini

nơi được build.gradle nằm ở đâu?
GAMA

Bên trong thư mục mô-đun ứng dụng của bạn. Thường là tên thư mục làapp
Mattia Maestrini

3
SettingsApi hiện đã được khắc họa.
Sagar Kacha

27

Thực hiện theo các bước được đề cập dưới đây

1) Tạo một LocationRequesttheo ý muốn của bạn

LocationRequest mLocationRequest = LocationRequest.create()
           .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
           .setInterval(10 * 1000)
           .setFastestInterval(1 * 1000);

2) Tạo mộtLocationSettingsRequest.Builder

LocationSettingsRequest.Builder settingsBuilder = new LocationSettingsRequest.Builder()
               .addLocationRequest(mLocationRequest);
settingsBuilder.setAlwaysShow(true);

3) Nhận LocationSettingsResponse Taskbằng cách sử dụng mã sau

Task<LocationSettingsResponse> result = LocationServices.getSettingsClient(this)
              .checkLocationSettings(settingsBuilder.build());

Lưu ý: LocationServices.SettingsApi không được dùng nữa nên hãy sử dụng SettingsClientThay vào đó.

4) Thêm a OnCompleteListenerđể nhận kết quả từ Nhiệm vụ. Khi Taskhoàn thành, khách hàng có thể kiểm tra cài đặt vị trí bằng cách xem mã trạng thái từ LocationSettingsResponseđối tượng.

result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
    @Override
    public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
    try {
        LocationSettingsResponse response = 
                          task.getResult(ApiException.class);
        } catch (ApiException ex) {
            switch (ex.getStatusCode()) {
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        ResolvableApiException resolvableApiException = 
                                 (ResolvableApiException) ex;
                            resolvableApiException
                                   .startResolutionForResult(MapsActivity.this, 
                                         LOCATION_SETTINGS_REQUEST);
                    } catch (IntentSender.SendIntentException e) {

                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:

                    break;
            }
        }
    }
});  

TRƯỜNG HỢP 1: LocationSettingsStatusCodes.RESOLUTION_REQUIRED Vị trí không được bật nhưng chúng tôi có thể yêu cầu người dùng bật vị trí bằng cách nhắc anh ta bật vị trí bằng hộp thoại (bằng cách gọi startResolutionForResult).

Yêu cầu Cài đặt Vị trí Bản đồ Google

TRƯỜNG HỢP 2:: LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE Cài đặt vị trí không hài lòng. Tuy nhiên, chúng tôi không có cách nào để sửa cài đặt nên chúng tôi sẽ không hiển thị hộp thoại.

5) OnActivityResult chúng tôi có thể nhận được hành động của người dùng trong hộp thoại cài đặt vị trí. RESULT_OK=> Người dùng đã bật Vị trí.RESULT_CANCELLED- Người dùng đã từ chối yêu cầu thiết lập vị trí.


11

Nó hoạt động tương tự như bản đồ google

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

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

đây hay kia

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

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

import android.content.Context;
import android.content.IntentSender;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
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.LocationSettingsStatusCodes;

import java.util.List;

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

}

2
Cài đặtApi hiện đã được khắc họa
Sagar Kacha

2
SettingsApi hiện không được dùng nữa. Bây giờ sử dụng SettingsClient: developers.google.com/android/reference/com/google/android/gms/...
Rishabh Chandel

9
implementation 'com.google.android.gms:play-services-location:16.0.0'

Sự định nghĩa biến

private SettingsClient mSettingsClient;
private LocationSettingsRequest mLocationSettingsRequest;
private static final int REQUEST_CHECK_SETTINGS = 214;
private static final int REQUEST_ENABLE_GPS = 516;

Mở hộp thoại bằng mã bên dưới

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(new LocationRequest().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY));
builder.setAlwaysShow(true);
mLocationSettingsRequest = builder.build();

mSettingsClient = LocationServices.getSettingsClient(YourActivity.this);

mSettingsClient
    .checkLocationSettings(mLocationSettingsRequest)
    .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            //Success Perform Task Here
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            int statusCode = ((ApiException) e).getStatusCode();
            switch (statusCode) {
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    try {
                        ResolvableApiException rae = (ResolvableApiException) e;
                        rae.startResolutionForResult(YourActivity.this, REQUEST_CHECK_SETTINGS);
                    } catch (IntentSender.SendIntentException sie) {
                        Log.e("GPS","Unable to execute request.");
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    Log.e("GPS","Location settings are inadequate, and cannot be fixed here. Fix in Settings.");
            }
        }
    })
    .addOnCanceledListener(new OnCanceledListener() {
        @Override
        public void onCanceled() {
            Log.e("GPS","checkLocationSettings -> onCanceled");
        }
    });

onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CHECK_SETTINGS) {
        switch (resultCode) {
            case Activity.RESULT_OK:
                //Success Perform Task Here
                break;
            case Activity.RESULT_CANCELED:
                Log.e("GPS","User denied to access location");
                openGpsEnableSetting();
                break;
        }
    } else if (requestCode == REQUEST_ENABLE_GPS) {
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        if (!isGpsEnabled) {
            openGpsEnableSetting();
        } else {
            navigateToUser();
        }
    }
}

private void openGpsEnableSetting() {
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivityForResult(intent, REQUEST_ENABLE_GPS);
}   

Cảm ơn! Nếu bạn sử dụng mã này trong phân đoạn, hãy xem stackoverflow.com/a/39579124/2914140 : thay vì rae.startResolutionForResult(activity, REQUEST_CHECK_SETTINGS)gọi startIntentSenderForResult(rae.getResolution().getIntentSender(), REQUEST_CHECK_SETTINGS, null, 0, 0, 0, null), nếu không onActivityResult()sẽ không được gọi.
CoolMind

Cảm ơn @CoolMind có thể được sử dụng cho những người cần điều này cho mảnh
Ketan Ramani

@CoolMind, có thể sử dụng thứ gì đó tương tự như startIntentSenderForResulttrong phương thức openGpsEnableSetting()không?
Aliton Oliveira

@AlitonOliveira, bạn có thể mô tả chi tiết không? Trong mã openGpsEnableSetting()chỉ cần bắt đầu một hộp thoại để bật cài đặt GPS. Sau khi nó kết thúc, onActivityResult()được gọi với requestCode == REQUEST_ENABLE_GPS.
CoolMind

onActivityResult()được gọi từ Activity và tôi đã tự hỏi liệu có thể trả về kết quả Fragmentnhư vậy không startIntentSenderForResult.
Aliton Oliveira

8

Cảm ơn Mattia Maestrini +1

Dung dịch Xamarin:

using Android.Gms.Common.Apis;
using Android.Gms.Location;

public const int REQUEST_CHECK_SETTINGS = 0x1;

private void DisplayLocationSettingsRequest()
{
    var googleApiClient = new GoogleApiClient.Builder(this).AddApi(LocationServices.API).Build();
    googleApiClient.Connect();

    var locationRequest = LocationRequest.Create();
    locationRequest.SetPriority(LocationRequest.PriorityHighAccuracy);
    locationRequest.SetInterval(10000);
    locationRequest.SetFastestInterval(10000 / 2);

    var builder = new LocationSettingsRequest.Builder().AddLocationRequest(locationRequest);
    builder.SetAlwaysShow(true);

    var result = LocationServices.SettingsApi.CheckLocationSettings(googleApiClient, builder.Build());
    result.SetResultCallback((LocationSettingsResult callback) =>
    {
        switch (callback.Status.StatusCode)
        {
            case LocationSettingsStatusCodes.Success:
                {
                    DoStuffWithLocation();
                    break;
                }
            case LocationSettingsStatusCodes.ResolutionRequired:
                {
                    try
                    {
                        // Show the dialog by calling startResolutionForResult(), and check the result
                        // in onActivityResult().
                        callback.Status.StartResolutionForResult(this, REQUEST_CHECK_SETTINGS);
                    }
                    catch (IntentSender.SendIntentException e)
                    {
                    }

                    break;
                }
            default:
                {
                    // If all else fails, take the user to the android location settings
                    StartActivity(new Intent(Android.Provider.Settings.ActionLocationSourceSettings));
                    break;
                }
        }
    });
}

protected override void OnActivityResult(int requestCode, Android.App.Result resultCode, Intent data)
{
    switch (requestCode)
    {
        case REQUEST_CHECK_SETTINGS:
            {
                switch (resultCode)
                {
                    case Android.App.Result.Ok:
                        {
                            DoStuffWithLocation();
                            break;
                        }
                    case Android.App.Result.Canceled:
                        {
                            //No location
                            break;
                        }
                }
                break;
            }
    }
}

GHI CHÚ:

Điều này sẽ không hoạt động với Huawei hoặc các thiết bị khác không được cài đặt các dịch vụ của Google.


Nó không hoạt động!! Bạn có thể vui lòng chia sẻ mã hoàn chỉnh
Omkar

Tôi đang cố gọi phương thức DisplayLocationSettingsRequest () từ phương thức OnCreate của Hoạt động Android. Nhưng rất tiếc, tôi không thể xem cửa sổ yêu cầu vị trí bật lên Vị trí. Bạn có thể vui lòng giúp tôi không.
Omkar,

@Omkar bạn đã cài đặt Xamarin.GooglePlayServices.Location qua Nuget chưa? Bạn đã bao gồm hai dòng trên using android.Gms.Common.Apis; using Android.Gms.Location;? Sau khi gọi, LocationServices.SettingsApi.CheckLocationSettingsbạn có nhận được Gọi lại trong vòng result.SetResultCallback(không? Đặt một điểm ngắt ở mỗi trong số đó và kiểm tra xem mã đang hoạt động gì
Pierre

Có, tôi đã thêm tất cả các điều kiện tiên quyết. Và tôi nhận được kết quả là Id = 1, Status = WaitingForActivation, Method = (null). Nhưng thời gian chờ đợi này là vô hạn vì đã đợi rất lâu mà không nhận được kết quả.
Omkar

4

Android Marshmallow 6 hỗ trợ quyền thời gian chạy. Quyền thời gian chạy chỉ hoạt động trên Marshmallow và trên tiền Marshmallow, nó vẫn hoạt động theo cách cũ.

Bạn có thể tìm hiểu thêm về nó trong Video chính thức của nhà phát triển Android này:

https://www.youtube.com/watch?v=C8lUdPVSzDk

Và yêu cầu quyền: http://developer.android.com/training/permissions/requesting.html


API Marshmallow có sẵn cho mục đích phát triển không?
GAMA

vậy điều đó có nghĩa là quy trình làm việc được hiển thị thông qua ảnh chụp màn hình chỉ có thể đạt được Marshmallow trở lên?
GAMA

Có, như đã nêu trong tài liệu, đó là API cấp 23 nên nó sẽ chỉ hoạt động trên Marshmallow và mới hơn.
Sharj

bất kỳ cách nào để đạt được hành vi tương tự trong hộp thoại tùy chỉnh của riêng tôi
Srishti Roy

4

Cảm ơn bạn Mattia Maestrini về Câu trả lời, tôi muốn thêm điều đó bằng cách sử dụng

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

sẽ đủ. Điều này ngăn ứng dụng của bạn bao gồm các thư viện không cần thiết và giúp giữ cho số lượng phương thức của bạn thấp.


2

Giải pháp Kotlin

Thêm vào build.gradle(Module:app)

implementation 'com.google.android.gms:play-services-location:17.0.0'
implementation 'com.google.android.gms:play-services-maps:17.0.0'

sau đó tạo chức năng này

fun enablegps() {

    val mLocationRequest = LocationRequest.create()
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
        .setInterval(2000)
        .setFastestInterval(1000)

    val settingsBuilder = LocationSettingsRequest.Builder()
        .addLocationRequest(mLocationRequest)
    settingsBuilder.setAlwaysShow(true)

    val result = LocationServices.getSettingsClient(this).checkLocationSettings(settingsBuilder.build())
    result.addOnCompleteListener { task ->

        //getting the status code from exception
        try {
            task.getResult(ApiException::class.java)
        } catch (ex: ApiException) {

            when (ex.statusCode) {

                LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> try {

                    Toast.makeText(this,"GPS IS OFF",Toast.LENGTH_SHORT).show()

                    // Show the dialog by calling startResolutionForResult(), and check the result
                    // in onActivityResult().
                    val resolvableApiException = ex as ResolvableApiException
                    resolvableApiException.startResolutionForResult(this,REQUEST_CHECK_SETTINGS
                    )
                } catch (e: IntentSender.SendIntentException) {
                    Toast.makeText(this,"PendingIntent unable to execute request.",Toast.LENGTH_SHORT).show()

                }

                LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {

                    Toast.makeText(
                        this,
                        "Something is wrong in your GPS",
                        Toast.LENGTH_SHORT
                    ).show()

                }


            }
        }



    }


}

1

Với bản cập nhật Marshmallow gần đây, ngay cả khi cài đặt Vị trí được bật, ứng dụng của bạn sẽ yêu cầu cấp quyền một cách rõ ràng. Cách được đề xuất để làm điều này là hiển thị phần Quyền trong ứng dụng của bạn, trong đó người dùng có thể chuyển đổi quyền theo yêu cầu. Đoạn mã để thực hiện việc này như sau:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Location Permission");
        builder.setMessage("The app needs location permissions. Please grant this permission to continue using the features of the app.");
        builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);}
        });
        builder.setNegativeButton(android.R.string.no, null);
        builder.show();
    }
} else {
    // do programatically as show in the other answer 
}

Và ghi đè onRequestPermissionsResultphương thức như sau:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_COARSE_LOCATION: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d(TAG, "coarse location permission granted");
                } else {
                    Intent intent = new Intent();
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivity(intent);
                }
            }
        }
    }

Một cách tiếp cận khác là bạn cũng có thể sử dụng SettingsApi để hỏi (các) nhà cung cấp vị trí nào được bật. Nếu không có ứng dụng nào được bật, bạn có thể nhắc một hộp thoại để thay đổi cài đặt từ bên trong ứng dụng.


1

Cách đơn giản nhất mà tôi tìm thấy trong quá trình nghiên cứu của mình là tạo một lớp Util cho quy trình yêu cầu vị trí này và sau đó gọi nó để BẬT gps cho chúng tôi.

Vui lòng kiểm tra blog này! Nó đã kể toàn bộ câu chuyện.

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.