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

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


当前回答

你可以使用requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);。如果您正在使用v4,请不要使用FragmentCompat。

其他回答

如果activity和fragment中都有onRequestPermissionsResult,请确保调用super。onRequestPermissionsResult in activity。它不是片段所需要的,但它是活动所需要的。

更新:看到别人的回答调用super.onRequestPermissionResult()在活动和修复我提到的请求代码问题,并调用片段的onRequestPermissionResult。

忽略这些东西:

对我来说,它是调用活动的onRequestPermissionResult,尽管我调用fragment.requestPermission(…),但它返回的结果是一个错误的requestCode(111变成65647为什么??我永远也不会知道)。

幸运的是,这是我们在屏幕上请求的唯一权限,所以我只是忽略了请求代码(没有时间弄清楚为什么它现在不正确)

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

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

我有一个很棒的解决方案来实现这个,像这样创建一个BaseActivity。

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this));


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                CustomToast.getInstance().setCustomToast("Now you can share the Hack.");

            } else {
                Toast.makeText(this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

}

现在你可以像这样调用代码来请求许可

 ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

每次这发生在任何地方无论是在片段中还是在任何活动中基活动都会被调用。

谢谢

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

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