android - Android中的分组权限
问题描述
在我解释我的场景之前,这里是我的代码。
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 个设置,第二个启用位置服务。基本上它们都位于不同的对话框中,这使得它 2 出现了两次。我想要将它们合并为一组权限(基于第一张图像),因此它将使用一个对话框,一个对话框将让用户启用以下功能(存储、相机、位置和位置服务)
解决方案
首先,您的代码似乎缺少onRequestPermissionsResult
处理用户接受/拒绝个人权限后发生的事情的方法。如链接所示,您可以使用 switch 语句并为每个权限设置逻辑,因此您可以决定哪些是可选的,哪些是强制性的,并相应地更改 UI 和应用程序行为。
其次,如果您要问的是是否可以在单个对话框中授予所有权限(来自多个组)(而不是每个组一个),那么这是不可能的。
根据官方文档:
注意:当您的应用调用 requestPermissions() 时,系统会向用户显示一个标准对话框。您的应用程序无法配置或更改该对话框。如果您需要向用户提供任何信息或解释,您应该在调用 requestPermissions() 之前这样做,如解释应用程序需要权限的原因中所述。
因此,在您的情况下,用户将获得 3 个权限对话框——存储、联系人和位置权限组各一个。
最后一个提示用户启用位置的对话框与权限无关,它只是切换 GPS 的设置。
推荐阅读
- sql-server - 无法将 varchar 空/空值插入或更新到始终加密的列中
- angular - 在 asp.net mvc 中使用 web api 从服务 Angular 6 调用 POST 方法到 REST
- node.js - 使用 mongoose 在 mongodb 中 findOne 结果返回集合的空值
- php - 试图获取非对象 laravel 的属性“图像”
- python - 使用 Python 进行迭代
- ssl-certificate - 为什么 MS Exchange 2013 OWA 卡在“加载”中,无法打开?
- c++ - SSD 序列号不正确
- php - dompdf 在生成 PDF 时不处理特殊字符
- javascript - TypeError:“实例 [方法名] 不是函数” - 结构 js 错误
- xamarin - 错误 Java.Interop.IJavaPeerable