我正在更新我们的应用程序,以使用新的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);
                }
            }
        }
    }
}

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


当前回答

这个问题实际上是由NestedFragments引起的。 基本上大多数片段都扩展了一个hostdfragment,而hostdfragment又扩展了一个CompatFragment。这些嵌套的片段导致了一些问题,这些问题最终由项目中的另一个开发人员解决。

他正在做一些低级别的东西,比如位切换来让它工作,所以我不太确定实际的最终解决方案

其他回答

如果你在fragment中使用requestPermissions,它接受2个而不是3个参数。

你应该使用requestPermissions(permissions, PERMISSIONS_CODE);

这个问题实际上是由NestedFragments引起的。 基本上大多数片段都扩展了一个hostdfragment,而hostdfragment又扩展了一个CompatFragment。这些嵌套的片段导致了一些问题,这些问题最终由项目中的另一个开发人员解决。

他正在做一些低级别的东西,比如位切换来让它工作,所以我不太确定实际的最终解决方案

我也遇到过这个问题。如果你想让处理权限的活动不在历史记录/最近记录中,那么你可能会想要更改AndroidManifest.xml条目。

如果你设置了你调用requestPermissions或AppCompatActivity的活动。requestPermissions与

android:noHistory="true"
android:excludeFromRecents="true"

那么onRequestPermissionsResult()将不会被调用。如果你的Activity是由Activity或AppCompatActivity派生的,这是正确的。

这可以通过删除'AndroidManifest.xml'和finishAndRemoveTask()来完成你的活动来修复。

如果你从一个片段中调用这段代码,它有自己的requestPermissions方法。

基本概念是,如果你在一个活动中,那么调用

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);

如果是碎片,就打电话

requestPermissions(permissionsList,
                            permissionscode);

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

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

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