Android M Permissions:onRequestPermissionsResult()未被调用

And*_*art 280 java permissions android android-permissions

我正在更新我们的应用程序以使用新的M权限系统.除了onRequestPermissionsResult()之外,它都在工作.我需要在按下按钮时检查权限,如果成功,则发送短信.当我授予这样做的权限时,对话框会关闭,但在我再次按下按钮之前它不会触发发送文本.

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

首先调用此方法:

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

然后我的回调看起来像这样:

    @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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

小智 566

我遇到了同样的问题,我刚刚找到了解决方案.使用支持库时,必须使用正确的方法调用.例如:

  • AppCompatActivity中,您应该使用ActivityCompat.requestPermissions ;
  • android.support.v4.app.Fragment中,你应该只使用requestPermissions(这是android.support.v4.app.Fragment的实例方法)

如果在片段中调用ActivityCompat.requestPermissions,则会在活动而不是片段上调用onRequestPermissionsResult回调.

希望这可以帮助!

  • 它也会在没有历史记录的情况下发生:https://code.google.com/p/android-developer-preview/issues/detail?id = 2915 (12认同)
  • "在android.support.v4.app.Fragment中,你应该只使用requestPermissions" - 谢谢! (11认同)
  • @AnthonyBobenrieth那么noHistory活动的解决方案是什么?我们根本无法从他们那里请求权限? (5认同)
  • 这应该被列为正确的答案 (4认同)
  • 当使用`Fragment.requestPermissions()`时,父Activity实际上正在接收`onRequestPermissionsResult()`.(这是支持库23.3.0) (3认同)
  • 链接被破坏了@AnthonyBobenrieth.有没有历史的解决方案? (2认同)

小智 98

你可以试试这个:

requestPermissions(permissions, PERMISSIONS_CODE);
Run Code Online (Sandbox Code Playgroud)

如果从片段调用此代码,则它具有自己的requestPermissions方法.我相信问题是你正在调用静态方法.

Pro Tip如果你想要onRequestPermissionsResult()一个片段: FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)

  • @goodgamerguy确保您不在活动的onRequestPermissionsResult中使用请求代码.如果你的活动也使用onRequestPermissionsResult回调你应该提供默认值:super.onRequestPermissionsResult(requestCode,permissions,grantResults); (4认同)

San*_*iya 66

我希望它运作正常

对于活动:

 ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

片段:

 requestPermissions(permissionsList,REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

  • 您不需要有关SDK 15的权限,只需Marshmallow及以上版本需要.. (4认同)

Sim*_*one 50

我也遇到过这个问题.如果您希望处理权限的活动不在历史记录/最近,那么您将很想更改您的AndroidManifest.xml条目.

如果您设置了您呼叫requestPermissionsAppCompatActivity.requestPermissions使用 的活动

android:noHistory="true"
android:excludeFromRecents="true"
Run Code Online (Sandbox Code Playgroud)

在你的AndroidManifest.xml当时onRequestPermissionsResult()不会被召唤.如果您的活动派生于Activity或,则属实AppCompatActivity.

这可以通过从"AndroidManifest.xml"中删除两个标志并完成您的活动finishAndRemoveTask()来解决.


小智 36

如果您同时拥有onRequestPermissionsResult活动和片段,请务必调用super.onRequestPermissionsResult活动.片段中不需要它,但它处于活动状态.

  • 偶然发现了这个.`FragmentActivity.onRequestPermissionsResult(..)`是对片段的`onRequestPermissionsResult(..)`的调用转发到的地方. (3认同)

Ben*_*hed 31

在片段内部,您需要调用:

FragmentCompat.requestPermissions(permissionsList, RequestCode)
Run Code Online (Sandbox Code Playgroud)

不:

ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);
Run Code Online (Sandbox Code Playgroud)

  • 与android.support.v13.app.FragmentCompat有关 (2认同)

小智 15

如果您在片段中使用requestPermissions,则它接受2个参数而不是3个.

你应该用 requestPermissions(permissions, PERMISSIONS_CODE);


Tou*_*der 15

如果由于某种原因你扩展了一个位于某个不调用super的外部库中的自定义Activity,你需要在Activity onRequestPermissionsResult中自己手动调用Fragment super.onRequestPermissionsResult.

YourActivity extends SomeActivityNotCallingSuperOnRequestPermissionsResult{
Fragment requestingFragment;//the fragment requesting the permission
...
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestingFragment!=null)
            requestingFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
...
Run Code Online (Sandbox Code Playgroud)


Mar*_*uez 12

您在FragmentCompat中有 pre Marshmallow设备的checkPermissions函数.我用这样的:

FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
Run Code Online (Sandbox Code Playgroud)

  • FragmentCompat.requestPermissions()不适用于android.support.v4.app.Fragment.任何人都知道如何处理这个. (4认同)
  • 这只有在android.app.fragment内部询问权限时才有效,你必须导入support-v13库! (2认同)

alm*_*oft 12

我发现你打电话的地方很重要android.support.v4.app.Fragment.requestPermissions.

如果你这样做onCreate(),onRequestPermissionsResult()永远不会被调用.

解决方案:调用它onActivityCreated();

@Override
public void onActivityCreated(Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) 
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 0);

}
Run Code Online (Sandbox Code Playgroud)


And*_*art 10

这个问题实际上是由NestedFragments引起的.基本上大多数片段我们扩展了一个HostedFragment,后者又扩展了CompatFragment.拥有这些嵌套的片段会导致最终由项目上的其他开发人员解决的问题.

他正在做一些低级别的事情,如位切换以使其工作,所以我不太确定实际的最终解决方案


Sha*_*auf 9

 /* use the object of your fragment to call the 
 * onRequestPermissionsResult in fragment after
 * in activity and use different request Code for 
 * both Activity and Fragment */

   if (isFragment)
    mFragment.requestPermissions(permissions.toArray(new
    String[permissions.size()]),requestPermission);

   else
    ActivityCompat.requestPermissions(mActivity,permissions.toArray(new
    String[permissions.size()]),requestPermission);
Run Code Online (Sandbox Code Playgroud)


Sum*_*are 6

这将有效..

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
Run Code Online (Sandbox Code Playgroud)

  • 你能给出任何理由吗? (6认同)

Pou*_*man 5

如果从片段调用此代码,则它具有自己的requestPermissions方法.

所以基本概念是,如果你在一个Activity中,那就打电话

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);
Run Code Online (Sandbox Code Playgroud)

如果在片段中,只需打电话

requestPermissions(permissionsList,
                            permissionscode);
Run Code Online (Sandbox Code Playgroud)


Ndh*_*eti 5

我有一个类似的问题,除了我按下一个按钮拨打电话,这会触发 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)