ActivityCompat.requestPermissions 请求时不显示提示 ACCESS_BACKGROUND_LOCATION
ActivityCompat.requestPermissions does not show prompt when requesting ACCESS_BACKGROUND_LOCATION
在 MainActivity 中请求权限:
对于 api >=29
当我请求权限时此代码不显示提示
public boolean RequestPermissions(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// api 29++
final String[] PERMISSIONS_API_Q = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
};
if ( checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED
)
{//Permissions Granted
GB.LOG("Permissions is granted");
getAndroidId();// getting device information
GB.isPermissionsGranted = true;
if(MainFragment.MainHandler!=null){
MainFragment.MainHandler.sendEmptyMessage(1);
}
LoadFoldersPath();
if(GB.CanManualMode){
CanConfig cc = new CanConfig();
cc.execute();
}
return true;
}
else {//Permissions is revoked
GB.LOG("Permissions is revoked");
Dialogs LocationInfoDialog = new Dialogs(MainActivity.this);
View.OnClickListener onClickListener= v -> {
ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST); //here is permission request
GB.isPermissionsGranted = false;
};
LocationInfoDialog.GPSUsageInBackGroundInfo(onClickListener);
return false;
}
}
}
当我删除这行时
> Manifest.permission.ACCESS_BACKGROUND_LOCATION
> checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) ==
> PackageManager.PERMISSION_GRANTED
这段代码工作正常
public boolean RequestPermissions(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// api 29++
final String[] PERMISSIONS_API_Q = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
};
if ( checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
)
{//Permissions Granted
GB.LOG("Permissions is granted");
getAndroidId();// getting device information
GB.isPermissionsGranted = true;
if(MainFragment.MainHandler!=null){
MainFragment.MainHandler.sendEmptyMessage(1);
}
LoadFoldersPath();
if(GB.CanManualMode){
CanConfig cc = new CanConfig();
cc.execute();
}
return true;
}
else {//Permissions is revoked
GB.LOG("Permissions is revoked");
Dialogs LocationInfoDialog = new Dialogs(MainActivity.this);
View.OnClickListener onClickListener= v -> {
ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST); //here is permission request
GB.isPermissionsGranted = false;
};
LocationInfoDialog.GPSUsageInBackGroundInfo(onClickListener);
return false;
}
}
}
您甚至可以在这里比较这两个代码以查看差异 https://text-compare.com/
但是如果我从请求中删除 ACCESS_BACKGROUND_LOCATION 一切正常,问题在哪里?
我发现解决方案 Manifest.permission.ACCESS_BACKGROUND_LOCATION
只有在您已经获得 ACCESS_FINE_LOCATION
许可后才能请求
这是结果
private static final int REQUEST = 1;
public boolean RequestPermissions() {
final String[] PERMISSIONS_API_M = {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
) {
if (!(checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
final String[] PERMISSIONS_API_Q = {
Manifest.permission.ACCESS_BACKGROUND_LOCATION
};
Dialogs AccessBackGroundDialog = new Dialogs(MainActivity.this);
View.OnClickListener onClickListener = v -> {
ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST);
};
AccessBackGroundDialog.GPSUsageInBackGroundInfo(onClickListener, true);
return false;
}
GB.LOG("Permissions is granted");
getAndroidId();// getting device information
GB.isPermissionsGranted = true;
if (MainFragment.MainHandler != null) {
MainFragment.MainHandler.sendEmptyMessage(1);
}
LoadFoldersPath();
if (GB.CanManualMode) {
CanConfig cc = new CanConfig();
cc.execute();
}
return true;
} else {
GB.LOG("Permissions is revoked");
ActivityCompat.requestPermissions(this, PERMISSIONS_API_M, REQUEST);
GB.isPermissionsGranted = false;
return false;
}
}
}
在 MainActivity 中请求权限:
对于 api >=29
当我请求权限时此代码不显示提示
public boolean RequestPermissions(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// api 29++
final String[] PERMISSIONS_API_Q = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
};
if ( checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED
)
{//Permissions Granted
GB.LOG("Permissions is granted");
getAndroidId();// getting device information
GB.isPermissionsGranted = true;
if(MainFragment.MainHandler!=null){
MainFragment.MainHandler.sendEmptyMessage(1);
}
LoadFoldersPath();
if(GB.CanManualMode){
CanConfig cc = new CanConfig();
cc.execute();
}
return true;
}
else {//Permissions is revoked
GB.LOG("Permissions is revoked");
Dialogs LocationInfoDialog = new Dialogs(MainActivity.this);
View.OnClickListener onClickListener= v -> {
ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST); //here is permission request
GB.isPermissionsGranted = false;
};
LocationInfoDialog.GPSUsageInBackGroundInfo(onClickListener);
return false;
}
}
}
当我删除这行时
> Manifest.permission.ACCESS_BACKGROUND_LOCATION
> checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) ==
> PackageManager.PERMISSION_GRANTED
这段代码工作正常
public boolean RequestPermissions(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {// api 29++
final String[] PERMISSIONS_API_Q = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION,
};
if ( checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
)
{//Permissions Granted
GB.LOG("Permissions is granted");
getAndroidId();// getting device information
GB.isPermissionsGranted = true;
if(MainFragment.MainHandler!=null){
MainFragment.MainHandler.sendEmptyMessage(1);
}
LoadFoldersPath();
if(GB.CanManualMode){
CanConfig cc = new CanConfig();
cc.execute();
}
return true;
}
else {//Permissions is revoked
GB.LOG("Permissions is revoked");
Dialogs LocationInfoDialog = new Dialogs(MainActivity.this);
View.OnClickListener onClickListener= v -> {
ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST); //here is permission request
GB.isPermissionsGranted = false;
};
LocationInfoDialog.GPSUsageInBackGroundInfo(onClickListener);
return false;
}
}
}
您甚至可以在这里比较这两个代码以查看差异 https://text-compare.com/
但是如果我从请求中删除 ACCESS_BACKGROUND_LOCATION 一切正常,问题在哪里?
我发现解决方案 Manifest.permission.ACCESS_BACKGROUND_LOCATION
只有在您已经获得 ACCESS_FINE_LOCATION
许可后才能请求
这是结果
private static final int REQUEST = 1;
public boolean RequestPermissions() {
final String[] PERMISSIONS_API_M = {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION};
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
) {
if (!(checkSelfPermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
final String[] PERMISSIONS_API_Q = {
Manifest.permission.ACCESS_BACKGROUND_LOCATION
};
Dialogs AccessBackGroundDialog = new Dialogs(MainActivity.this);
View.OnClickListener onClickListener = v -> {
ActivityCompat.requestPermissions(this, PERMISSIONS_API_Q, REQUEST);
};
AccessBackGroundDialog.GPSUsageInBackGroundInfo(onClickListener, true);
return false;
}
GB.LOG("Permissions is granted");
getAndroidId();// getting device information
GB.isPermissionsGranted = true;
if (MainFragment.MainHandler != null) {
MainFragment.MainHandler.sendEmptyMessage(1);
}
LoadFoldersPath();
if (GB.CanManualMode) {
CanConfig cc = new CanConfig();
cc.execute();
}
return true;
} else {
GB.LOG("Permissions is revoked");
ActivityCompat.requestPermissions(this, PERMISSIONS_API_M, REQUEST);
GB.isPermissionsGranted = false;
return false;
}
}
}