我正在编写一种方法,如果存在并启用了GPS传感器,它将返回true,但如果没有或关闭则返回false。事实证明这很难......
hasSystemFeature("FEATURE_LOCATION_GPS") // on PackageManager
返回false,表示设备是否具有GPS。因此,即使在具有一个的设备上,并且它已打开,它仍然返回false。对我来说似乎完全错了,但我看不出原因。
isProviderEnabled("gps") // on LocationManager
返回true,即使在我这里没有GPS硬件的设备上也是如此。这似乎完全违反直觉。
我接受这些结果可能是因为我遗漏了某些东西,SDK不直观,或者甚至我正在测试的设备表现得很奇怪。
我错过了什么?
答案 0 :(得分:14)
这应该有效。进行此调用时,logcat中是否有任何错误消息?
PackageManager pm = getPackageManager();
boolean hasGps = pm.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
答案 1 :(得分:2)
如果设备没有GPS硬件,则以下情况属实:
locationManager.getProvider(LocationManager.GPS_PROVIDER) == null;
哪里
LocationManager locationManager = (LocationManager) AppCore.context().getSystemService(Context.LOCATION_SERVICE);
在我的情况下,即使设备没有GPS,* hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)*也会返回true。所以它不可靠。
答案 2 :(得分:1)
您的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
意图操作启用GPS。
希望有所帮助!