gpt4 book ai didi

android - requestLocationUpdates 参数对 Gingerbread 设备没有影响

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:50 25 4
gpt4 key购买 nike

我之前编写了一个带有位置监听器的应用程序,但无法访问真实设备。现在我有了 Gingerbread 手机 (2.3.3),不出所料,我的应用程序是电池 killer 。

我开始检查更新时间和最小距离参数对 requestLocationUpdates 的影响,因为文档说这些会影响电池消耗。

我想知道仅仅调整这些参数会如何影响电池消耗,据我所知,GPS 必须保持打开状态,才能知道设备移动了多远,并且只有通知应用程序的实际过程会在芯片继续使用电源时发生变化。

本文Understanding the LocationListener in Android提出可信的解释,表示状态会变为“暂时不可用”,GPS图标会从屏幕上消失一段时间,直到需要按照规定的更新周期重新打开。

这不会发生在我的手机上 - 即使更新周期为 90 秒,GPS 图标也会保持亮起,并且我没有看到任何状态变化,根据文章末尾的一些帖子文章,其他人发现相同。

  • SO 上的任何用户在使用 2.3.3 时遇到过同样的事情吗?

  • 还是 Android 放弃了管理 GPS 芯片并期望用户为 GPS 编写自己的电池管理机制?

有关信息,我演示此行为的最少代码如下所示:

public class GpsTimeOutTestActivity extends Activity implements
LocationListener {

private LocationManager mLocMgr;
private long mUpdatePeriod = 90000; // 90 seconds
private float mMinDistance = 10.0f;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

@Override
protected void onResume() {
super.onResume();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
mUpdatePeriod, mMinDistance, (LocationListener) this);
}

@Override
protected void onPause() {
mLocMgr.removeUpdates((LocationListener) this);
super.onPause();
}

@Override
public void onLocationChanged(Location loc) {
String str = null;
NumberFormat formatter = new DecimalFormat("##0.000");
String fLat = formatter.format(loc.getLatitude());
String fLon = formatter.format(loc.getLongitude());
String provider = loc.getProvider();
provider = (provider == null) ? "No provider" : provider;
str = "Locn chg " + provider + " Lat/Lon " + fLat + "/" + fLon;
if (loc.hasAccuracy())
str+= " accy " + loc.getAccuracy();

showSomeOutput(str);
}

@Override
public void onProviderDisabled(String provider) {
String str = "Prov disabled " + provider;
showSomeOutput(str);
}

@Override
public void onProviderEnabled(String provider) {
String str = "Prov enabled " + provider;
showSomeOutput(str);
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
String str = "Status chg " + provider;
switch (status) {
case android.location.LocationProvider.OUT_OF_SERVICE:
str+= " OUT OF SERVICE";
break;
case android.location.LocationProvider.AVAILABLE:
str+= " AVAILABLE";
break;
case android.location.LocationProvider.TEMPORARILY_UNAVAILABLE:
str+= " TEMPORARILY UNAVAILABLE";
break;
default:
str+= " UNKNOWN STATUS";
}
showSomeOutput(str);
}

private void showSomeOutput(String str) {
Log.d("GPSTEST", str);
EditText et = (EditText) findViewById(R.id.editText1);
Editable existingText = et.getText();
existingText.append("\n" + str);
}
}

我们将不胜感激地接收所有评论。

最佳答案

如果你深入研究 GPS provider 的内部结构,你会发现安卓告诉原生驱动最短更新时间。然后本地驱动程序可以决定要做什么 - 根据我的经验,他们都无视这一点并继续全速运行。

这很烦人,但并不完全违反 javadocs :

The frequency of notification may be controlled using the minTime and minDistance parameters. If minTime is greater than 0, the LocationManager could potentially rest for minTime milliseconds between location updates to conserve power

(强调)

解决方案是只在需要时注册您的 LocationListener。如果您需要在添加 requestSingleUpdate 之前定位 API,则必须注册您的监听器,然后在您对位置的质量感到满意时取消注册。这将关闭 GPS 并节省电量。

关于android - requestLocationUpdates 参数对 Gingerbread 设备没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7637337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com