【问题标题】:Android Marshmallow, locationManager.isProviderEnbled always return falseAndroid Marshmallow,locationManager.isProviderEnbled 总是返回 false
【发布时间】:2016-03-28 20:54:55
【问题描述】:
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        //getting GPS status
        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        //getting network status
        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

两者都是错误的,虽然我确实检查了 Marshmallow ,但有运行时权限之类的东西,所以我关注了这些链接 link1link2

并在 isNetworkEnabled 返回 0 之前进行了一些调试并将checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION); 放入,即PERMISSION_GRANTED

代码

SplashScreenActivity

public class SplashScreenActivity extends Activity {

    private static final String TAG = "SplashScreenActivity";
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    final private int REQUEST_CODE_ASK_PERMISSIONS = 123;

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.activity_splashscreen);

        int hasLocationPermission = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
        if (hasLocationPermission != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    REQUEST_CODE_ASK_PERMISSIONS);
            return;
        }
        //comes till here . ie hasLocationPermission is true 
        LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE);

        checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION); //breakpoint at this line gives 0 ie PERMISSION_GRANTED

        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); //false at debug breakpoint
        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);//false at debug breakpoint

    }


}

清单Here

【问题讨论】:

  • 你在哪里执行这个?在模拟器中还是在真实设备上?如果是真的,那么请说明:模型、构建(操作系统版本和内部版本号)和任何可能相关的 logcat.. 很可能您有 2 个不同的活动或任何一个有权限的活动,而 1 没有.. .. 也 hasWriteContactsPermission 检查 GPS 是不好的做法...使用其他人可能阅读并理解该变量的确切名称...同样适用于 Build.VERSION.SDK_INT >= 23 chek this
  • @Bonatti 将其更新为 hasLocationPermission,在设备中执行此操作:Samsung Edge 6,android M,android ver 6.0.1 build# MMB29K.G925IDVU3EPC5,在此处记录pastebin.com/9WstqwL1,但是通过调试我能够查明该问题仅在 locationManager.isProviderEnabled
  • @Bonatti 你所说的1 has permissions, and 1 does not 是什么意思我通过调试检查了 GPS Tracker 类,它有权限
  • 它更好,但是,如果我们要提供帮助,信息是必须的.​​.....在getLocation(),放一个 Log.v(TAG, "hasLocationPermission "+hasLocationPermission);` on它,然后将 LogCat 粘贴到您的问题上,以便其他人可以提供帮助。该函数中出现的android 对象是什么?最后,在您的应用程序中添加一些详细信息...您似乎希望获得线性代码执行的结果,而 GPS 可能需要一段时间来收集数据。

标签: android android-6.0-marshmallow


【解决方案1】:

使用这段代码,它适用于所有的android版本-

创建一个布尔类型的方法来检查用户是否有权限-

 private boolean checkPermission() {

    boolean flag = true;

    String[] permissions = {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION"};
    boolean hasPermission = (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
    if (!hasPermission) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(permissions, com.jeenees.androidapp.utils.Keys.FILE_READ_PERMISSION);
            flag = false;
        }
    } else {
        flag = true;
    }

    return flag;
}

在你喜欢的地方使用上面的方法-

 LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

 if (checkPermission()){
            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); //false at debug breakpoint
            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);//false at debug breakpoint
  }

希望这会对您有所帮助。

【讨论】:

    【解决方案2】:

    问题出在设备上,我尝试使用 Nexus 5x 并且同一段代码返回 true。 问题在于三星的最新棉花糖更新

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多