gpt4 book ai didi

android - 如何请求允许在android中打开GPS

转载 作者:行者123 更新时间:2023-11-29 16:44:17 26 4
gpt4 key购买 nike

我通过 FusedLocationProviderClient.getLastLocation() 获取用户的位置,但仅当用户已经打开位置时。喜欢: /image/paQKO.png

如果位置关闭,我得到空值。

在应用程序设置中显示已授予位置权限!!

帮助获取not null当前位置。


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

private static final String FINE_LOCATION = android.Manifest.permission.ACCESS_FINE_LOCATION;
private static final String COARSE_LOCATION = android.Manifest.permission.ACCESS_COARSE_LOCATION;
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
protected static final int REQUEST_CHECK_SETTINGS = 0x1;
private GoogleApiClient mGoogleApiClient;

private Boolean mLocationPermissionGranted = false;
private FusedLocationProviderClient mFusedLocationProviderClient;

private static final String TAG = "SelectGroup";

@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: starts");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_group);

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

getLocationPermission();
}

//calling getDeviceLocation()
private void init(){
Log.d(TAG, "init: starts");
if (mLocationPermissionGranted) {
Log.d(TAG, "init: calling getDeviceLocation");

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "init: returning");
return;
}
getDeviceLocation();
}
}

private void getDeviceLocation() {
Log.d(TAG, "getDeviceLocation: getting devices current location");

mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
try {
if (mLocationPermissionGranted) {

Task location = mFusedLocationProviderClient.getLastLocation();
location.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
Log.d(TAG, "onComplete: found location");
Location currentLocation = (Location) task.getResult();
//LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
Log.d(TAG, "onComplete: currentlocation is " + currentLocation);

if(currentLocation !=null) {
double lat = currentLocation.getLatitude();
double lon = currentLocation.getLongitude();

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
SharedPreferences.Editor editor = pref.edit();
editor.putString("lat", lat + "");
editor.putString("lon", lon + "");
editor.apply();
Log.d(TAG, "onComplete: lat,lon : " + lat + "," + lon);
}
else {
Log.d(TAG, "onComplete: inside else where currentlocation is null");
settingsrequest();
Log.d(TAG, "onComplete: after settingsrequest");
double lat = currentLocation.getLatitude();
double lon = currentLocation.getLongitude();

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
SharedPreferences.Editor editor = pref.edit();
editor.putString("lat", lat + "");
editor.putString("lon", lon + "");
editor.apply();
}
}
}
});
}

} catch (SecurityException e) {
Log.e(TAG, "getDeviceLocation: SecurityException " + e.getMessage());
}
}

//calling init() after complete
private void getLocationPermission(){
String permissions[] = {android.Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};

Log.d(TAG, "getLocationPermission: before if condition");
if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
mLocationPermissionGranted = true;
Log.d(TAG, "getLocationPermission: calling init");
init();
}else {
ActivityCompat.requestPermissions(this,
permissions,
LOCATION_PERMISSION_REQUEST_CODE);
}
}else {
ActivityCompat.requestPermissions(this,
permissions,
LOCATION_PERMISSION_REQUEST_CODE);
}
}

//calling init() after complete
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
mLocationPermissionGranted = false;

switch (requestCode){
case LOCATION_PERMISSION_REQUEST_CODE:{
if(grantResults.length > 0){
for(int i=0; i<grantResults.length;i++){
if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
mLocationPermissionGranted = false;
return;
}
}
mLocationPermissionGranted = true;
Toast.makeText(this, "Permission Granted : OnRequest", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onRequestPermissionsResult: calling init");
init();
}
}
}
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
//startLocationUpdates();
Log.d(TAG, "onActivityResult: Result Ok");
Toast.makeText(this, "Request : Result Ok", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
//settingsrequest();//keep asking if imp or do whatever
Log.d(TAG, "onActivityResult: Result cancelled");
Toast.makeText(this, "Request : Result cancelled", Toast.LENGTH_SHORT).show();
break;
}
break;
}
}

@Override
protected void onStart() {
super.onStart();
settingsrequest();
}

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(SelectGroup.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
Toast.makeText(SelectGroup.this, "Error Occured", Toast.LENGTH_SHORT).show();
}
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
public void onConnected(@Nullable Bundle bundle) {
Log.d(TAG, "onConnected: called");
}

@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "onConnectionSuspended: called");
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionFailed: called");
}
}

我试过了 https://stackoverflow.com/a/38264716/8018480但不明白如何让它成为可能!

最佳答案

您应该首先检查位置设置,并在请求最后一个位置之前解决错误(如果有)

LocationRequest request = LocationRequest.create();
LocationSettingsRequest settingsRequest = new LocationSettingsRequest.Builder()
.addLocationRequest(request)
.build()
LocationServices.getSettingsClient(this/*activity*/)
.checkLocationSettings(settingsRequest)
.addOnCompleteListener(new OnCompleteListener() {
public void onComplete(Task task) {
if(task.isSuccessful()) {
// ***REQUEST LAST LOCATION HERE***
} else {
Exception e = task.getException()
if (e instanceOf ResolvableApiException) {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult()
((ResolvableApiException)e).startResolutionForResult(Activity.this, REQUEST_CHECK_SETTINGS);
} else {
//Location can not be resolved, inform the user
}
}
}
});

并在 onActivityResult 上检查 startResolutionForResult 的结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final LocationSettingsStates states = LocationSettingsStates.fromIntent(intent);
switch (requestCode) {
case REQUEST_CHECK_SETTINGS:
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made ...
// ***REQUEST LAST LOCATION HERE***
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to ...
break;
default:
break;
}
break;
}
}

引用:https://developers.google.com/android/reference/com/google/android/gms/location/SettingsClient

关于android - 如何请求允许在android中打开GPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49140630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com