【问题标题】:How to check for the presence of a GPS sensor?如何检查 GPS 传感器的存在?
【发布时间】:2011-02-17 16:48:48
【问题描述】:

我正在编写一个方法,如果存在并启用 GPS 传感器将返回 true,但如果它不存在或关闭则返回 false。事实证明这很难,因为...

hasSystemFeature("FEATURE_LOCATION_GPS")  // on PackageManager

无论设备是否有 GPS,都返回 false。因此,即使在有一个设备并且它已打开,它仍然返回 false。对我来说似乎完全错了,但我不明白为什么。

isProviderEnabled("gps")   // on LocationManager

返回 true,即使在我这里有一个根本没有 GPS 硬件的设备上。这似乎也完全违反直觉。

我接受这些结果可能是因为我遗漏了一些东西,SDK 不直观,或者我正在测试的设备行为异常。

我错过了什么?

【问题讨论】:

    标签: android gps


    【解决方案1】:

    这应该可行。进行此调用时,logcat 中是否有任何错误消息?

    PackageManager pm = getPackageManager();
    boolean hasGps = pm.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
    

    【讨论】:

    • 没有错误,但它在根本没有 GPS 的设备上返回 true(Advent Vega 10" 非谷歌批准的平板电脑)。也许平板电脑是罪魁祸首,而操作系统是在设备上设置不正确。
    • 设备开发人员必须实现一个 PackageManager 类,因为 SDK PackageManager 是抽象的。这不是设备开发人员第一次破坏某些东西。
    • 我在 Kinde Fire(没有 GPS)上测试了它,它就像一个魅力。 (我想支持非谷歌批准的胡扯是不值得的)
    【解决方案2】:

    如果设备没有 GPS 硬件,则以下情况为真:

    locationManager.getProvider(LocationManager.GPS_PROVIDER) == null;
    

    在哪里

    LocationManager locationManager = (LocationManager) AppCore.context().getSystemService(Context.LOCATION_SERVICE);
    

    在我的情况下,即使设备没有 GPS,*hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)* 也会返回 true。所以不靠谱。

    【讨论】:

      【解决方案3】:

      您的 hasSystemFeature() 可能总是返回 false,因为 FEATURE_LOCATION_GPS 是对常量的引用,而不是字符串文字。我相信它指向的当前字符串文字实际上是“android.hardware.location.gps”。

      我相信你正在寻找的是这样的:

      LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
      if(!manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
          //Ask the user to enable GPS
          AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setTitle("Location Manager");
          builder.setMessage("Would you like to enable GPS?");
          builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  //Launch settings, allowing user to make a change
                  Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                  startActivity(i);
              }
          });
          builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  //No location service, no Activity
                  finish();
              }
          });
          builder.create().show();
      }
      

      我添加了关于AlertDialog 的额外内容,以指出您可以直接将用户带到位置设置页面,让他们使用Settings.ACTION_LOCATION_SOURCE_SETTINGS Intent 操作启用 GPS。

      希望有帮助!

      【讨论】:

      • 是的,当然,字符串需要通过静态常量来。我错过了它,因为该常量仅在 API8 及更高版本中,并且我的目标是 API5。但是我手动将常量添加为字符串,它可以工作。我完全期望它可能无法在所有情况下工作,但这只是一个尽可能改进 UI 的测试,所以如果它对某些人来说失败了,他们不会知道。谢谢。
      • 我说得太早了。 hasSystemFeature("android.hardware.location.gps") 对于有 GPS 的设备和没有 GPS 的设备都返回 true。如此简单的事情被证明如此困难是多么令人沮丧。 isProviderEnabled(Location.GPS_PROVIDER) 仍然返回 true,即使设备根本没有 GPS。
      • 您正在测试的两种设备是什么?另外,我想我可能会指出LocationManager.getAllProviders() 如果根本不支持LocationProvider.GPS_PROVIDER,则其返回列表中不会有LocationProvider.GPS_PROVIDER,这将是您检查 GPS 是否存在的另一种方式。
      猜你喜欢
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多