强制关闭 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 位置权限的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在“强制关闭”后自动重启应用程序?

在循环中使用 setBackgroundColor 和 setImageDrawable 时 Android 强制关闭 [关闭]

何时在运行时请求 Android Marshmallow 6.0 的权限?

用户在Android应用中停用位置权限时的广播接收器?

跟踪 Android 设备的位置 [关闭]

android 怎么调用强制关闭