Android M权限:onRequestPermissionsResult()没有被调用

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

我已经debugging并在onRequestPermissionsResult()方法中设置断点,但它永远不会进入它。

这个方法首先被调用:

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

然后我的callback看起来像这样:

  @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); } } } } } 

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

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

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

如果您在一个片段中调用ActivityCompat.requestPermissions,则会在活动上调用onRequestPermissionsResultcallback,而不是片段。

希望这可以帮助!

你可以试试这个:

 requestPermissions(permissions, PERMISSIONS_CODE); 

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

专业提示,如果你想片段中的onRequestPermissionsResult()FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)

我也遇到过这个问题。 如果你想要处理不在历史/最近的权限的活动,那么你将会试图改变你的AndroidManifest.xml条目。

如果您使用的是调用requestPermissionsAppCompatActivity.requestPermissions的活动

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

在你的AndroidManifest.xml那么onRequestPermissionsResult()将不会被调用。 如果您的Activity是从ActivityAppCompatActivity派生的,则这是真实的。

这可以通过从“AndroidManifest.xml”中删除两个标记并使用finishAndRemoveTask()来完成。

我希望它能正常工作

对于活动:

  ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE); 

对于片段:

  requestPermissions(permissionsList,REQUEST_CODE); 

如果您在活动和片段中都有onRequestPermissionsResult ,请确保在活动中调用super.onRequestPermissionsResult 。 在片段中不是必需的,而是在活动中。

里面的片段,你需要调用:

 FragmentCompat.requestPermissions(permissionsList, RequestCode) 

不:

 ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode); 

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

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

如果由于某种原因,您已经扩展了一个位于某个外部库中的自定义Activity,而这个库不会调用super,那么您需要手动调用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); } ... 

你有FragmentCompat中棉花糖前设备的checkPermissionsfunction。 我使用这样的:

 FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); 

我已经发现,这是重要的,你调用android.support.v4.app.Fragment.requestPermissions

如果你在onCreate()onRequestPermissionsResult()永远不会被调用。

解决scheme:在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); } 
  /* 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); 

这个问题实际上是由NestedFragments引起的。 基本上我们大部分的片段都扩展了一个HostedFragment,它继而扩展了一个CompatFragment。 拥有这些嵌套的片段会导致问题最终由项目中的另一个开发人员解决。

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

这将工作..

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

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

所以基本的概念是,如果你在一个活动,然后打电话

 ActivityCompat.requestPermissions(this, permissionsList, permissionscode); 

如果在一个片段,只是打电话

 requestPermissions(permissionsList, permissionscode); 

在根据上面的答案检查一切之前,请确保您的请求代码不是0!

检查FragmentActivity.java中的onRequestPermissionsResult()的代码:

 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { int index = (requestCode>>16)&0xffff; if (index != 0) { index--; String who = mPendingFragmentActivityResults.get(index); mPendingFragmentActivityResults.remove(index); if (who == null) { Log.w(TAG, "Activity result delivered for unknown Fragment."); return; } Fragment frag = mFragments.findFragmentByWho(who); if (frag == null) { Log.w(TAG, "Activity result no fragment exists for who: " + who); } else { frag.onRequestPermissionsResult(requestCode&0xffff, permissions, grantResults); } } } 
 private void showContacts() { if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS); } else { doShowContacts(); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS && grantResults[0] == PackageManager.PERMISSION_GRANTED) { doShowContacts(); } } 

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

基于goodgamerguy的回答 ,解决scheme是:

 myFragment.this.requestPermissions(....) 

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

忽略这个东西:

对我来说,尽pipe我调用了fragment.requestPermission(…),但是它调用了Activity的onRequestPermissionResult,但是它返回了一个不正确的requestCode(111变成了65647为什么我永远不会知道)的结果。

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