Java如何在运行时请求位置许可

在清单文件中,我添加了粗略的权限,当我在装有Android 6的设备上运行时,什么也没发生!我尝试了所有方法,但无法获取位置更新…

我究竟做错了什么?

public class MainActivity extends AppCompatActivity implements LocationListener {

LocationManager locationManager;

String provider;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

provider = locationManager.getBestProvider(new Criteria(), false);

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

// ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

// public void onRequestPermissionsResult(int requestCode, String[] permissions,

// int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

return;

}

Location location = locationManager.getLastKnownLocation(provider);

if (location != null) {

Log.i("Location Info", "Location achieved!");

} else {

Log.i("Location Info", "No location :(");

}

}

@Override

protected void onResume() {

super.onResume();

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

// ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

// public void onRequestPermissionsResult(int requestCode, String[] permissions,

// int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

return;

}

locationManager.requestLocationUpdates(provider, 400, 1, this);

}

@Override

protected void onPause() {

super.onPause();

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

// ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

// public void onRequestPermissionsResult(int requestCode, String[] permissions,

// int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

return;

}

locationManager.removeUpdates(this);

}

@Override

public void onLocationChanged(Location location) {

Double lat = location.getLatitude();

Double lng = location.getLongitude();

Log.i("Location info: Lat", lat.toString());

Log.i("Location info: Lng", lng.toString());

}

@Override

public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override

public void onProviderEnabled(String provider) {

}

@Override

public void onProviderDisabled(String provider) {

}

public void getLocation(View view) {

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

// ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

// public void onRequestPermissionsResult(int requestCode, String[] permissions,

// int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

return;

}

Location location = locationManager.getLastKnownLocation(provider);

onLocationChanged(location);

}

}

回答:

实际上需要在运行时请求“位置”权限(请注意代码中的说明)。

这是经过测试的有效代码,用于请求“位置”权限。

确保导入android.Manifest

import android.Manifest;

然后将此代码放在Activity中:

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;

public boolean checkLocationPermission() {

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION)

!= PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?

if (ActivityCompat.shouldShowRequestPermissionRationale(this,

Manifest.permission.ACCESS_FINE_LOCATION)) {

// Show an explanation to the user *asynchronously* -- don't block

// this thread waiting for the user's response! After the user

// sees the explanation, try again to request the permission.

new AlertDialog.Builder(this)

.setTitle(R.string.title_location_permission)

.setMessage(R.string.text_location_permission)

.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

//Prompt the user once explanation has been shown

ActivityCompat.requestPermissions(MainActivity.this,

new String[]{Manifest.permission.ACCESS_FINE_LOCATION},

MY_PERMISSIONS_REQUEST_LOCATION);

}

})

.create()

.show();

} else {

// No explanation needed, we can request the permission.

ActivityCompat.requestPermissions(this,

new String[]{Manifest.permission.ACCESS_FINE_LOCATION},

MY_PERMISSIONS_REQUEST_LOCATION);

}

return false;

} else {

return true;

}

}

@Override

public void onRequestPermissionsResult(int requestCode,

String permissions[], int[] grantResults) {

switch (requestCode) {

case MY_PERMISSIONS_REQUEST_LOCATION: {

// If request is cancelled, the result arrays are empty.

if (grantResults.length > 0

&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted, yay! Do the

// location-related task you need to do.

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION)

== PackageManager.PERMISSION_GRANTED) {

//Request location updates:

locationManager.requestLocationUpdates(provider, 400, 1, this);

}

} else {

// permission denied, boo! Disable the

// functionality that depends on this permission.

}

return;

}

}

}

然后在中调用checkLocationPermission()方法onCreate()

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//.........

checkLocationPermission();

}

然后onResume(),您可以使用和onPause()完全按照问题中的说明进行操作。

这是一个精简版本,更加简洁:

@Override

protected void onResume() {

super.onResume();

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION)

== PackageManager.PERMISSION_GRANTED) {

locationManager.requestLocationUpdates(provider, 400, 1, this);

}

}

@Override

protected void onPause() {

super.onPause();

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION)

== PackageManager.PERMISSION_GRANTED) {

locationManager.removeUpdates(this);

}

}

以上是 Java如何在运行时请求位置许可 的全部内容, 来源链接: utcz.com/qa/410687.html

回到顶部