【问题标题】:How to Re-Check Permissions on Resume如何重新检查简历的权限
【发布时间】:2019-02-05 02:28:31
【问题描述】:

如果用户通过应用启用位置权限,我的应用会崩溃,然后前往他们手机的设置并在那里禁用该权限。我尝试通过 onResume 检查权限来解决此问题,但似乎无法正确解决。 StackOverflow 上的其他解决方案没有奏效。

以下代码在我的 onCreate() 中运行并检查位置权限:

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                mMap.setMyLocationEnabled(true);
            } else {
                //check which API users are running.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    //location permission dialog
                    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_FINE_LOCATION);
                }
            }

我的 onRequestPermissionsResult():

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case MY_PERMISSION_FINE_LOCATION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    mMap.setMyLocationEnabled(true);
                }

            } else {
                Toast.makeText(getContext(), "The app requires location permissions", Toast.LENGTH_LONG).show();
                getActivity().finish();
            }
            break;
    }
}

这是我在同一片段中的 onResume() 代码:

@Override
public void onResume() {
    super.onResume();
    updatePermissions();
    if (googleApiClient.isConnected()) {
        requestLocationUpdates();
    }
}

public void updatePermissions(){
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    //    mMap.setMyLocationEnabled(true);
    } else {
       //check which API users are running.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //location permission dialog
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSION_FINE_LOCATION);
        }
    }

}

应用程序崩溃并出现以下错误: java.lang.ArrayIndexOutOfBoundsException:长度=0;在 fluo.tuki10.fragments.MapFragment.onRequestPermissionsResult(MapFragment.java:232) 处的 index=0

这是行

           if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

我觉得解决方案是实现更好的 onResume(),在用户在应用程序之外修改权限后检查权限。不幸的是我的代码不足

【问题讨论】:

  • checkSelfPermission 将导致您的活动进入Pause。因此,如果用户不允许使用Never Ask Again 的权限,这可能会进入无限递归。
  • @Marios 已正确回答。在查询特定索引处的信息之前,您需要检查数组的长度。您可以检查 Android 开发人员文档是否也推荐相同的内容。 developer.android.com/training/permissions/requesting 访问标题为“处理权限请求响应”的部分
  • @ADM 我应该用什么替换它?

标签: android android-studio android-fragments android-lifecycle onresume


【解决方案1】:

在将其与并非没有元素的头部进行比较之前的建议:

如果 (grantResults.length> 0)

【讨论】:

  • 这会解决 ADM 描述的无限循环问题吗?
  • 可能不会,但很明显,如果他按照我的建议编写代码,他会看到:Toast.makeText (getContext (), "The app requires location permissions", Toast.LENGTH_LONG ) 。显示 ();他会明白许可证没有“答案”。
  • 你知道如何修复循环错误吗?它仍然崩溃
  • 许多不同的解决方案,首先 yiu 可以在任务中移动你 requestlocationupdate,重复 10/100 秒控制权限...所有逻辑代码在他里面,而不是在 resume() 中。
猜你喜欢
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2014-04-27
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多