我使用FusedLocationProviderClient来获取用户的位置,所以,我只想在用户未启用的GPS时会向用户显示对话框以启用它

时间:2018-03-17 20:40:18

标签: android android-location android-gps

我使用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);




    }
}

1 个答案:

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