我正在尝试从 android.support.v4.app.Fragment
调用的 AsyncTask
请求权限。
在doInBackground
方法上有这段代码
int hasWriteContactsPermission = ContextCompat.checkSelfPermission((Context)ctx,
Manifest.permission.SEND_SMS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale((AppCompatActivity)ctx,
Manifest.permission.SEND_SMS)) {
showMessageOKCancel("Necessary permissions", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[]{Manifest.permission.SEND_SMS},
REQUEST_CODE_ASK_PERMISSIONS);
}
});
return;
}
/******** PROBLEM
requestPermissions(new String[] {Manifest.permission.SEND_SMS},
REQUEST_CODE_ASK_PERMISSIONS);
*************/
return;
}
通过 AppCompatActivity 调用 requestPermissions 对我来说无效,因为我需要在 Fragment
中捕获 onRequestPermissionsResult
,而不是在 Activity
中
问题是 requestPermissions 说这个错误:
Cannot resolve method requestPermissions
我如何从 Asynctask
调用 requestPermissions
方法来捕获调用方 Fragment 的结果?
最佳答案
其实你不能在doInBackground方法里面请求权限,因为顾名思义,它是在后台工作,向用户请求权限需要使用UI线程。我建议您像这样调用请求权限:
public void checkPermissions() {
final String[] permissions = new String[]{Manifest.permission.SEND_SMS}
if ( ContextCompat.checkSelfPermission(this,
android.Manifest.permission.SEND_SMS )
!= PackageManager.PERMISSION_GRANTED ) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
android.Manifest.permission.SEND_SMS )){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Permission Needed");
builder.setMessage("You must accept the permission.");
builder.setPositiveButton(R.string.global_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ActivityCompat.requestPermissions(ConfigurarActivity.this,
permissions,
PERMISSION_REQUEST);
}
});
builder.setNegativeButton(R.string.global_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
dialog.show();
} else {
ActivityCompat.requestPermissions(this,
permissions,
PERMISSION_REQUEST);
}
}else{
//doTaskThatNeedThePermission can be async
}
}
关于android - 从 Asynctask 调用 requestPermissions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503110/