以编程方式启用 gps 的问题
Posted
技术标签:
【中文标题】以编程方式启用 gps 的问题【英文标题】:Issue with enabling gps programmatically 【发布时间】:2019-09-01 22:45:28 【问题描述】:我编写了一个代码来检查是否启用了 gps,如果未启用,用户会收到一个提示,要求启用 gps。单击“确定”后,gps 将自动启用。以下是我编写的用于检查 GPS 连接的代码。
private void locationPermissions()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
if (ContextCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this,
new String[]android.Manifest.permission.ACCESS_FINE_LOCATION, 22);
else
gpssettings(this);
else
gpssettings(this);
private void gpssettings(Context applicationContext)
LocationRequest locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
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.
fireauth();
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(
SplashScreen.this,
99);
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;
);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode)
case 99:
switch (resultCode)
case RESULT_OK:
fireauth();
break;
case RESULT_CANCELED:
Toast.makeText(this, "Requires gps connection", Toast.LENGTH_SHORT).show();
finish();
break;
break;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 22)
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED)
gpssettings(this);
else
Toast.makeText(this, "Location permissions required", Toast.LENGTH_SHORT).show();
finish();
但从过去 10 天开始,它的行为很奇怪。即使用户单击“确定”,我也会在 activityResult 中得到 result_cancelled。请检查代码并判断是否有任何问题或其他问题。
【问题讨论】:
【参考方案1】:请使用此功能强制开启 GPS 定位
分级:
实现 'com.google.android.gms:play-services:12.0.1'
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener
Activity activity;
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
if (!mGoogleApiClient.isConnected())
mGoogleApiClient.connect();
locationChecker(mGoogleApiClient);
@Override
public void onConnected(@Nullable Bundle bundle)
@Override
public void onConnectionSuspended(int i)
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult)
public void locationChecker(GoogleApiClient mGoogleApiClient)
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(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(activity, 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;
);
【讨论】:
没用,还是一样。 请使用这个最终的 LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) // 禁用 else // 启用 我应该在哪里添加这些行? 应用程序的任何屏幕,您要在其中检查 GPS 的开启或关闭。以上是关于以编程方式启用 gps 的问题的主要内容,如果未能解决你的问题,请参考以下文章
以 Android 编程方式启用 GPS(无需导航到位置设置)