我正在更新我们的应用程序,以使用新的M运行时权限系统。 除了onRequestPermissionsResult()之外,它都在工作。我需要检查按下按钮的权限,如果成功,就发送一条短信。当我授权这样做时,对话框会关闭,但直到我再次按下按钮,它才会触发“发送文本”。

我已经在onRequestPermissionsResult()方法中调试和设置了断点,但它从未进入它。

首先调用这个方法:

    private void askForPermission() {
    String[] permissions = new String[]{Manifest.permission.SEND_SMS};
    ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}

然后我的回调函数是这样的:

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

    if (requestCode == PERMISSIONS_CODE) {
        for (int i = 0; i < permissions.length; i++) {
            String permission = permissions[i];
            int grantResult = grantResults[i];

            if (permission.equals(Manifest.permission.SEND_SMS)) {
                if (grantResult == PackageManager.PERMISSION_GRANTED) {
                    onPPSButtonPress();
                } else {
                    requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
                }
            }
        }
    }
}

有人遇到过类似的问题吗? 感谢任何帮助。 谢谢


当前回答

我也遇到了同样的问题,我只是找到了解决方案。在使用Support库时,必须使用正确的方法调用。例如:

当在AppCompatActivity中,你应该使用ActivityCompat.requestPermissions; 在android.support.v4.app中。你应该简单地使用requestPermissions(这是android.support.v4.app.Fragment的一个实例方法)

如果你调用ActivityCompat。在一个片段中,onRequestPermissionsResult回调函数是在活动上调用的,而不是在片段上。

其他回答

对于kotlin用户,这里我的扩展检查和验证权限没有覆盖onRequestPermissionResult

 * @param permissionToValidate (request and check currently permission)
 *
 * @return recursive boolean validation callback (no need OnRequestPermissionResult)
 *
 * */
internal fun Activity.validatePermission(
    permissionToValidate: String,
    recursiveCall: (() -> Boolean) = { false }
): Boolean {
    val permission = ContextCompat.checkSelfPermission(
        this,
        permissionToValidate
    )

    if (permission != PackageManager.PERMISSION_GRANTED) {
        if (recursiveCall()) {
            return false
        }

        ActivityCompat.requestPermissions(
            this,
            arrayOf(permissionToValidate),
            110
        )
        return this.validatePermission(permissionToValidate) { true }
    }

    return true

}

你可以试试这个:

requestPermissions(permissions, PERMISSIONS_CODE);

如果你从一个片段中调用这段代码,它有自己的requestPermissions方法。我相信问题是你正在调用静态方法。

如果你想在一个片段中使用onRequestPermissionsResult(): FragmentCompat。requestPermissions(Fragment Fragment, String[] permissions, int requestCode)

我还遇到了一个问题,即使你调用正确的requestPermissions,你仍然可以有这个问题。问题是父活动可能会在不调用super的情况下重写此方法。加上超级,问题就解决了。

我有一个类似的问题,除了我按下一个按钮进行调用,这触发了callIntent。我首先检查权限,如果没有授予我要求权限和onRequestPermissionResult我调用检查权限,并再次调用。

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case Constants.PERMISSIONS_REQUEST_CALL_PHONE: {
            if ( grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                checkPermissionsAndCall();
            }
        }
    }
}

public void checkPermissionsAndCall(){
    if (Build.VERSION.SDK_INT > 22) {
        if(ContextCompat.checkSelfPermission(getContext(),
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED){
            requestPermissions( new String[]{Manifest.permission.CALL_PHONE}, Constants.PERMISSIONS_REQUEST_CALL_PHONE);
        }
        else{
            callIntent();
        }
    }
}

根据goodgamerguy的回答,解决方案是:

myFragment.this.requestPermissions(....)