我需要在两个单独的请求中向用户询问GPS和文件系统权限。
预期的行为::该应用显示对GPS权限的请求,在用户做出决定后,该应用将显示文件系统许可请求,并让用户再次做出决定。
实际行为::仅显示对GPS权限的请求,并且文件系统权限被自动拒绝,而不会显示任何对话框。
目标Android版本: 5.0及更高版本(API 21 +)
有人可以告诉我如何解决此问题吗?预先谢谢你!
我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
checkLocationPermissions();
checkLoggingPermissions();
...
...
}
private void checkLoggingPermissions() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Requesting filesystem permissions from user");
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.WRITE_EXTERNAL_STORAGE},
FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE);
}
else {
LoggingService.init();
}
}
else {
LoggingService.init();
}
}
private void checkLocationPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Requesting GPS permissions from user");
ActivityCompat.requestPermissions(this, new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.INTERNET
}, FrontendConstants.PERMISSION_GPS_REQUEST_CODE);
}
else {
locationService = LocationService.getInstance(this);
}
}
else {
locationService = LocationService.getInstance(this);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
if(FrontendConstants.PERMISSION_GPS_REQUEST_CODE == requestCode) {
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "+++ User accepted GPS permission request");
locationService = LocationService.getInstance(this);
}
else {
Log.e(TAG, "--- User rejected GPS permission request");
}
}
if(FrontendConstants.PERMISSION_FILESYSTEM_REQUEST_CODE == requestCode) {
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "+++ User accepted filesystem permission request");
LoggingService.init();
}
else {
Log.e(TAG, "--- User rejected filesystem permission request");
}
}
}
答案 0 :(得分:1)
理想情况下,您可以在一个请求中执行此操作,以简化用户和您的工作。
话虽如此,要获得所需的流程,请从两个地方致电checkLoggingPermissions()
:
从checkLocationPermissions()
开始,如果用户已经授予了您过去运行的应用程序(例如,在您拥有locationService = LocationService.getInstance(this);
的分支中)的权限
从onRequestPermissionsResult()
开始,如果用户刚刚授予了位置权限
然后,as Pawel mentioned删除Manifest.permission.INTERNET
,因为它是normal
权限,不需要运行时验证。
答案 1 :(得分:0)
因此,我已根据您的建议解决了问题。现在,我的方法是在一个请求中要求所有权限,然后在onRequestPermissionsResult
中分析结果。
为此,我创建了PermissionsHelper类:
import android.content.pm.PackageManager;
public class PermissionsHelper {
private String[] permissions;
private int[] grantResults;
public PermissionsHelper(String[] permissions, int[] grantResults) {
this.permissions = permissions;
this.grantResults = grantResults;
}
public boolean isPermissionGranted(String permission) {
final int length = permissions.length;
for(int i = 0; i < length; i++) {
if(permissions[i].equals(permission)) {
return grantResults[i] == PackageManager.PERMISSION_GRANTED;
}
}
// if permission wasn't found, we weren't even asking for it, so we consider it
// as granted
return true;
}
public boolean arePermissionsGranted(String ... permissions) {
for(String permission : permissions) {
if(!isPermissionGranted(permission)) return false;
}
return true;
}
}
然后我在“活动”中执行此操作,它似乎运行良好:
private void requestPermissions() {
requestPermissions(new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
});
}
private void requestPermissions(String[] permissions) {
List<String> notGranted = new ArrayList<>();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for(String permission : permissions) {
if(checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
notGranted.add(permission);
}
}
if(!notGranted.isEmpty()) {
ActivityCompat.requestPermissions(this, notGranted.toArray(new String[0]),
FrontendConstants.PERMISSION_REQUEST_CODE);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
if(FrontendConstants.PERMISSION_REQUEST_CODE == requestCode) {
PermissionsHelper helper = new PermissionsHelper(permissions, grantResults);
if(helper.isPermissionGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
Log.i(TAG, "+++ User accepted filesystem permission request");
}
else {
Log.e(TAG, "--- User rejected filesystem permission request");
}
if(helper.arePermissionsGranted(Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION)) {
Log.i(TAG, "+++ User accepted GPS permission request");
}
else {
Log.e(TAG, "--- User rejected GPS permission request");
}
}
}