在我解释我的场景之前,这是我的代码。
public class Permission extends AppCompatActivity implements ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<LocationSettingsResult> {
public static final int MULTIPLE_PERMISSIONS = 10;
Timer myTimer;
TimerTask doThis;
protected GoogleApiClient mGoogleApiClient;
protected LocationRequest locationRequest;
int REQUEST_CHECK_SETTINGS = 100;
String[] permissions = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
mGoogleApiClient.connect();
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(30 * 1000);
locationRequest.setFastestInterval(5 * 1000);
/* TODO : Grant the following permissions
* 1. Request Read External Storage OK
* 2. Request Write External Storage OK
* 3. Request Read Intenal Storage OK
* 4. Request Write External Storage OK
* 5. Request GPS (2) OK
* 6. Request Camera OK
* */
if (checkPermissions()) {
Intent standby = new Intent(Permission.this, standby.class);
startActivity(standby);
}
Button btn_enable = findViewById(R.id.enable);
btn_enable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EnablePermissions();
}
});
/* Check if permission is done */
myTimer = new Timer();
int delay = 0;
int period = 1000;
doThis = new TimerTask() {
public void run() {
if (checkPermissions()) {
myTimer.cancel();
Intent standby = new Intent(Permission.this, standby.class);
startActivity(standby);
}
}
};
myTimer.scheduleAtFixedRate(doThis, delay, period);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(this, ""+requestCode, Toast.LENGTH_SHORT).show();
if (requestCode == REQUEST_CHECK_SETTINGS) {
if (resultCode == RESULT_OK) {
//Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();
} else {
//Toast.makeText(getApplicationContext(), "GPS is not enabled", Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
private boolean checkPermissions() {
int result;
List<String> listPermissionsNeeded = new ArrayList<>();
for (String p : permissions) {
result = ContextCompat.checkSelfPermission(this, p);
if (result != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(p);
}
}
if (!listPermissionsNeeded.isEmpty()) {
return false;
}
return true;
}
private boolean EnablePermissions() {
int result;
List<String> listPermissionsNeeded = new ArrayList<>();
for (String p : permissions) {
result = ContextCompat.checkSelfPermission(this, p);
if (result != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(p);
}
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
@Override
public void onConnected(@Nullable Bundle bundle) {
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
builder.setAlwaysShow(true);
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(
mGoogleApiClient,
builder.build()
);
result.setResultCallback(this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// NO need to show the dialog;
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// GPS turned off, Show the user a dialog
try {
// Show the dialog by calling startResolutionForResult(), and check the result
// in onActivityResult().
status.startResolutionForResult(Permission.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
//failed to show dialog
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are unavailable so not possible to show any dialog now
break;
}
}
}
而这个的输出就是这个。
和
我的问题是我怎么能把它作为一个?我的意思是允许每一个允许的组权限。
我不知道该怎么办。我指的是将所有权限合并为一个然后如果用户没有选择最后一个仍然可以。
对困惑感到抱歉。根据我的代码,第一个权限启用3个设置,第二个启用位置服务。基本上它们都位于不同的对话框上,这使得它出现两次。我想将它们合并为一个组权限(基于第一个图像),因此它将使用一个对话框,该对话框将允许用户启用以下内容(存储,相机,位置和位置服务)
首先,您的代码似乎缺少onRequestPermissionsResult
方法,该方法将处理用户接受/拒绝单个权限后发生的情况。如链接中所示,您可以使用switch语句并为每个权限提供逻辑,因此您可以决定哪个是可选的,哪个是必需的,并相应地更改UI和应用程序行为。
其次,如果你问的是是否可以在一个对话框中授予所有权限(来自多个组)(而不是每个组一个),那么就不可能。
注意:当您的应用调用requestPermissions()时,系统会向用户显示标准对话框。您的应用无法配置或更改该对话框。如果您需要向用户提供任何信息或说明,则应在调用requestPermissions()之前执行此操作,如解释应用程序需要权限的原因所述。
因此,在您的情况下,用户将获得3个权限对话框 - 存储,联系人和位置权限组各一个。
提示用户启用位置的最后一个对话框与权限无关,它只是切换GPS的设置。