android - 从 Asynctask 调用 requestPermissions

标签 android android-fragments android-permissions

我正在尝试从 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/

相关文章:

android - HTML5 视频移除叠加播放图标

Android ShareActionProvider 在 Debug模式下工作,但在真实设备上不工作

android - setOnItemClickListener() 方法在 fragment 中不起作用

android - 两种方法都在授予权限后运行

java - Android View 从 .xml 到 .java - 依赖项

java - 正确调用方法 "buildRoadOverlay"

android - 错误 : incompatible types: Fragment cannot be converted to MapFragment

java - 如何在 RecyclerView.ViewHolder 中引用 fragment ?请查看详情

android - 请求推送通知的权限

android - 请求权限 NameNotFoundException android M