强制关闭 Android 位置权限
Posted
技术标签:
【中文标题】强制关闭 Android 位置权限【英文标题】:Force close on Android Location Permissions 【发布时间】:2017-10-27 20:45:47 【问题描述】:我正在尝试使用网络和 GPS 获取用户的位置。这就是我的流程 -
-
获取位置管理器
检查 Network_Provider 是否启用
如果启用,请检查权限、获取权限并使用网络获取位置。
如果没有,请检查 GPS_Provider,如果未启用,请从设置活动中启用 GPS,否则获取权限并使用 GPS 获取位置。
问题 - 当我尝试请求权限时,应用程序进入强制关闭模式。也许,我在错误的地方询问权限?请放一些光。
这是相同的代码 -
private void getLocationMgr()
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Log.v(TAG, "Network enabled? " + isNetworkEnabled);
if (isNetworkEnabled)
getLocation(locationManager, LocationManager.NETWORK_PROVIDER);
else
boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (isGPSEnabled == false) // go to GPS settings
else
getLocation(locationManager, LocationManager.GPS_PROVIDER);
private void getLocation(final LocationManager locationManager, final String provider)
// Getting permissions from user for location access
if (ContextCompat.checkSelfPermission(MainActivity.this,
android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(MainActivity.this,
new String[]android.Manifest.permission.ACCESS_FINE_LOCATION,
MY_PERM_FINE_LOCATION);
locationManager.requestSingleUpdate(provider, new LocationListener()
@Override
public void onLocationChanged(Location location)
Log.v(TAG, "Provider: " + provider);
Log.v(TAG, "Location: " + location.getLatitude() + " " + location.getLongitude());
Geocoder geocoder = new Geocoder(MainActivity.this, Locale.getDefault());
try
List<Address> addresses = geocoder.getFromLocation(location.getLatitude(),
location.getLongitude(), 1);
if (addresses.size() > 0)
Log.v(TAG, "City : " + addresses.get(0).getLocality());
Log.v(TAG, "Country: " + addresses.get(0).getCountryCode());
setCityExecute(addresses.get(0).getLocality(), addresses.get(0).getCountryCode());
else
Log.v(TAG, "Unable to get city");
catch (IOException e)
e.printStackTrace();
@Override
public void onStatusChanged(String s, int i, Bundle bundle)
@Override
public void onProviderEnabled(String s)
@Override
public void onProviderDisabled(String s)
, null);
原因:java.lang.SecurityException:“网络”位置提供程序 需要 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限。 在 android.os.Parcel.readException(Parcel.java:1684) 在 android.os.Parcel.readException(Parcel.java:1637) 在 android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:614) 在 android.location.LocationManager.requestLocationUpdates(LocationManager.java:887) 在 android.location.LocationManager.requestSingleUpdate(LocationManager.java:695) 在 com.pavanbawdane.weatherinformation.MainActivity.getLocation(MainActivity.java:140) 在 com.pavanbawdane.weatherinformation.MainActivity.getLocationMgr(MainActivity.java:99) 在 com.pavanbawdane.weatherinformation.MainActivity.onCreate(MainActivity.java:81)
【问题讨论】:
“当我尝试请求权限时,应用程序进入强制关闭模式”——使用 LogCat 检查与崩溃相关的 Java 堆栈跟踪:***.com/questions/23353173/… 崩溃与权限对话框有关。 这对我们没有多大帮助,因为我们无法从这里看到您的堆栈跟踪。您的显示器转错了方向,需要考虑地球的曲率... :-) 请编辑问题并发布与崩溃相关的完整 Java 堆栈跟踪。 对不起。我现在添加了堆栈跟踪。 PS:异常与请求权限有关,我正在请求权限,但不知道它是否是正确的地方。 【参考方案1】:requestPermissions()
是异步的。当该方法返回时,您确实没有拥有权限。到那时,用户甚至还没有被要求授予您权限。
如果您确定自己没有权限,需要致电requestPermissions()
,您还不能尝试获取位置。当您被告知用户是否授予您权限时,您需要最早在onRequestPermissionsResult()
中执行此操作。
请参阅this sample app,了解如何请求权限,然后请求位置。
【讨论】:
谢谢@CommonsWare。我错过了 onRequestPermissionResult() 部分并且不知道 requestPermissions 是异步的。【参考方案2】:不要在getLocation()
方法中调用locationManager.requestSingleupdate()
。
请求权限后,重写 onRequestPermissionResult() 方法。 在该方法中,您必须检查是否授予了权限。
如果授予权限,则调用locationManager.requestSingleupdate()
。
【讨论】:
【参考方案3】:你必须使用这个很棒的库Dexter 这很容易帮助您处理请求许可并在许可确认或被拒绝时采取行动。
【讨论】:
这似乎是一个非常好的库。我会看看它。谢谢你。 :)以上是关于强制关闭 Android 位置权限的主要内容,如果未能解决你的问题,请参考以下文章
在循环中使用 setBackgroundColor 和 setImageDrawable 时 Android 强制关闭 [关闭]