【发布时间】: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