【问题标题】:Android M Permissions: onRequestPermissionsResult() not being called in custom button classAndroid M 权限:onRequestPermissionsResult() 未在自定义按钮类中调用
【发布时间】:2016-04-28 12:34:27
【问题描述】:

我有一个自定义按钮类,我在其中请求按钮单击的 CALL_PHONE 权限。一切都很好,但我没有在 onRequestPermissionResult() 中获得用户结果。下面我发布了我的自定义按钮类。

public class CustomCallExecutiveButton extends Button implements View.OnClickListener, ActivityCompat.OnRequestPermissionsResultCallback {

Context mContext;
private Button mCallButton;
private int REQUEST_CALL = 1;

public CustomCallExecutiveButton(Context context) {

    super(context);
    mContext = context;
    init();
}

public CustomCallExecutiveButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    init();
}

public CustomCallExecutiveButton(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    mContext = context;
    init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomCallExecutiveButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    mContext = context;
    init();
}


private void init() {
    setOnClickListener(this);
}

@Override
public void onClick(View v) {

    CheckCallPermission();


}
public void CheckCallPermission() {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE);
    if (permission != PackageManager.PERMISSION_GRANTED) {
        requestCameraPermission();
    } else {
        intentToCall();
    }
}

public void intentToCall() {
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse("tel:" + "9069118117"));
    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {

        return;
    }
    mContext.startActivity(callIntent);
}

public void requestCameraPermission() {

    if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext,Manifest.permission.CALL_PHONE)) {
        openCallPermissionDailog();

    } else {
        openCallPermissionDailog();
    }
}

public void openCallPermissionDailog() {

    //Requesting camera and storage permission dailog
    android.app.AlertDialog.Builder alert = new android.app.AlertDialog.Builder(mContext);
    alert.setTitle("Permission");
    alert.setMessage("Phone State Permission Needed To Make Call.");
    alert.setPositiveButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
    alert.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //when user clicks on yes onRequestPermissionResult tells whether user granted permission or not.
            ActivityCompat.requestPermissions((Activity) mContext,
                    new String[]{Manifest.permission.CALL_PHONE},
                    REQUEST_CALL);
        }
    });

    alert.show();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if (requestCode == REQUEST_CALL) {

        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Camera permission has been granted, preview can be displayed
            intentToCall();
        }


    }

}
}

提前谢谢各位:)

【问题讨论】:

    标签: android runtime android-6.0-marshmallow user-permissions


    【解决方案1】:

    我没有在 onRequestPermissionResult() 中获得用户结果

    是的,你是。它将转到mContext 所代表的任何活动的onRequestPermissionResult()

    恕我直言,您的所作所为违反了关注点分离。更像是控制器的东西,例如活动或片段,负责检查和请求权限,而不是视图。

    话虽如此,如果您希望保留更多现有代码,欢迎您让活动将 onRequestPermissionResult() 结果转发到视图。

    【讨论】:

    • 这意味着我无法在自定义类中获得结果。我需要在使用自定义类的所有活动中实现 onRequestPermissionResult。
    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多