我使用FusedLocationProviderClient来获取用户的位置,所以,我只是想当用户未启用GPS时会向用户显示对话框,当用户按下按钮时启用它会自动启用GPS 这是我使用它的代码,因为我没有找到自动转GPS的东西 package com.example.giantpc.giantlocationnew;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.SettingsClient;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 1000;
TextView txt_location;
Button btn_start_update, btn_stop_update;
FusedLocationProviderClient fusedLocationProviderClient;
LocationRequest locationRequest;
LocationCallback locationCallback;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CODE: {
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
} else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
}
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Init View//
txt_location = findViewById(R.id.txt_location);
btn_start_update = findViewById(R.id.btn_start_update);
btn_stop_update = findViewById(R.id.btn_stop_update);
//Check permission runtime
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
} else {
//if permission is granted
buildLocationRequest();
buildLocationCallBack();
//Create FusedProviderClient
fusedLocationProviderClient= LocationServices.getFusedLocationProviderClient(this);
// Create LocationSettingsRequest object using location request
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
LocationSettingsRequest locationSettingsRequest = builder.build();
// Check whether location settings are satisfied
// https://developers.google.com/android/reference/com/google/android/gms/location/SettingsClient
SettingsClient settingsClient = LocationServices.getSettingsClient(this);
settingsClient.checkLocationSettings(locationSettingsRequest);
//set event click for button
btn_start_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
return;
}
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper());
//Change state of button
btn_start_update.setEnabled(!btn_start_update.isEnabled());
btn_stop_update.setEnabled(!btn_stop_update.isEnabled());
}
});
btn_stop_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
return;
}
fusedLocationProviderClient.removeLocationUpdates(locationCallback);
//Change state of button
btn_start_update.setEnabled(!btn_start_update.isEnabled());
btn_stop_update.setEnabled(!btn_stop_update.isEnabled());
}
});
}
}
private void buildLocationCallBack() {
locationCallback= new LocationCallback()
{
@Override
public void onLocationResult(LocationResult locationResult) {
for(Location location :locationResult.getLocations())
{
txt_location.setText(String.valueOf(location.getLatitude())+"/"+String.valueOf(location.getLongitude()));
}
}
};
}
private void buildLocationRequest() {
locationRequest= new LocationRequest();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(5000);
locationRequest.setFastestInterval(3000);
locationRequest.setSmallestDisplacement(10);
}
}
答案 0 :(得分:0)
首先在您的活动中添加这两个功能:
/**
* Returns the current state of the permissions needed.
*/
private boolean checkPermissions() {
return PackageManager.PERMISSION_GRANTED ==
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
}
private void requestPermissions() {
boolean shouldProvideRationale =
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION);
// Provide an additional rationale to the user. This would happen if the
// user denied the
// request previously, but didn't check the "Don't ask again" checkbox.
if (shouldProvideRationale) {
Log.i(TAG, "Displaying permission rationale to provide additional
context.");
Snackbar.make(findViewById(R.id.activity_home),
R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
.setAction(android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View view) {
// Request permission
ActivityCompat.requestPermissions(HomeActivity.this,
new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
REQUEST_PERMISSIONS_REQUEST_CODE);
}
})
.show();
} else {
Log.i(TAG, "Requesting permission");
// Request permission. It's possible this can be auto answered if device
//policy
// sets the permission in a given state or the user denied the permission
// previously and checked "Never ask again".
ActivityCompat.requestPermissions(HomeActivity.this, new String[] {
Manifest.permission.ACCESS_FINE_LOCATION },
REQUEST_PERMISSIONS_REQUEST_CODE);
}
}
下一步重写此功能,如下所示:
/**
* Callback received when a permissions request has been completed.
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]
permissions, @NonNull int[] grantResults) {
Log.i(TAG, "onRequestPermissionResult");
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
if (grantResults.length <= 0) {
// If user interaction was interrupted, the permission request is
//cancelled and you
// receive empty arrays.
Log.i(TAG, "User interaction was cancelled.");
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission was granted.
// Bind to the service. If the service is in foreground mode, this
//signals to the service
// that since this activity is in the foreground, the service can exit
//foreground mode.
bindService(new Intent(this, LocationService.class), mServiceConnection,
Context.BIND_AUTO_CREATE);
setMyLocationEnabled(true);
} else {
// Permission denied.
Snackbar.make(findViewById(R.id.activity_home),
R.string.permission_denied_explanation,
Snackbar.LENGTH_INDEFINITE).setAction(R.string.settings_label, new
View.OnClickListener() {
@Override
public void onClick(View view) {
// Build intent that displays the App settings screen.
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", BuildConfig.APPLICATION_ID,
null);
intent.setData(uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}).show();
}
}
}
最后在onCreate函数中:
if (!checkPermissions()) {
requestPermissions();
} else {
// Bind to the service. If the service is in foreground mode, this signals
//to the service
// that since this activity is in the foreground, the service can exit
//foreground mode.
bindService(new Intent(this, LocationService.class), mServiceConnection,
Context.BIND_AUTO_CREATE);
}