【无标题】

* 使用定位功能分两步:

* 第一步:检查是否有定位权限,直接在当面Activity弹窗申请。

* 第二步:检查是否开启了定位服务,如果没有开启,要跳到设置页面去设置。

package com.example.permissiontest;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;


/**
 * 使用定位功能分两步:
 *    第一步:检查是否有定位权限,直接在当面Activity弹窗申请。
 *    第二步:检查是否开启了定位服务,如果没有开启,要跳到设置页面去设置。
 */
public class MainActivity extends Activity {

    private TextView tv_hello;


    private final int LOCATION_REQUEST_PERMISSION = 1001;
    private final int LOCATION_SERVICE_SETTINGS = 1002;

    private String[] permission_location = new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION/*, android.Manifest.permission.ACCESS_COARSE_LOCATION*/};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_hello = findViewById(R.id.tv_hello);

        requestPermission(permission_location);
    }


    //第一步:申请权限
    public void requestPermission(String[] permission) {
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Log.e("xxx", "申请权限");
            ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST_PERMISSION);
        } else {
            nextStep();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode,permissions,grantResults);

        if (requestCode == LOCATION_REQUEST_PERMISSION) {
            //用户点击了"确定" == grantResults[0] == PackageManager.PERMISSION_GRANTED)
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Log.e("xxx","获取到了权限");

                 nextStep();
            } else {
               Toast.makeText(MainActivity.this,"警告:没有定位权限,有些功能可能不能使用",Toast.LENGTH_SHORT).show();
            }
        }
    }

    public void nextStep(){
        if(isLocServiceEnable(this)){
            tv_hello.setText("恭喜你,现在可以使用定位服务了.");
        }else{
            Log.e("xxx","去设置定位服务");
            showSettingDialog();
        }
    }


    // 第二步:在确定我们的app本身已经具有了定位权限后,检查手机是否已经打开了定位服务,如果没有开启,去设置
    public boolean isLocServiceEnable(Context context) {
        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (gps || network) {
            return true;
        }

        return false;
    }

    public void showSettingDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setMessage("尚未开启位置定位服务");

        builder.setPositiveButton("开启", new DialogInterface.OnClickListener() {
            @Override

            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivityForResult(intent, LOCATION_SERVICE_SETTINGS);
            }
        });

        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        builder.show();
    }

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

        Log.e("xxx","从设置页面回来了");

        if(requestCode == LOCATION_SERVICE_SETTINGS){
            //如果从设置页面回来了,再走头再走一次逻辑
            requestPermission(permission_location);
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:background="#008333"
        android:gravity="center"
        android:text="还不能使用定位"
        android:textColor="@color/white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>