- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我之前编写了一个带有位置监听器的应用程序,但无法访问真实设备。现在我有了 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/
我正在发送纬度、经度和位置名称以保存在服务器上....问题是当我第一次运行我的应用程序时它正常并保存以上数据一次...当我关闭我的应用程序并且模拟器正在运行时并且 eclipse 也再次启动我的应用程
RequestLocationUpdates 是 LocationManager 的一个方法,周期性接收 GPS 信息。 我认为如果我从 onCreate 应用程序发送应该不会有问题,因为它不会对主线
我正在尝试从 2 个不同的提供商处获取位置信息:网络和 GPS。 我在 requestLocationUpdates 中使用 minTime 1 分钟和 minDistance 300 米。使用这些参
您好,我正在尝试从 UI 线程以外的线程请求位置更新,我在以下行中得到一个 RuntimeExeption: // request location updates using Cellular lm
我是 Android 和 Xamarin 世界的新手。我正在尝试为位置管理器创建一个单独的类以用于不同的 Activity 。这是我的代码 using System; using Android.Co
在我的 Android 应用程序中,我使用 GoogleApiClient 来处理位置服务。当我按以下方式调用 requestLocationUpdates() 时一切正常: locationProv
使用带有 requestLocationUpdates() 的位置管理器对象与仅使用 LocationListener 有什么区别?他们都做同样的事情并且以同样的方式工作吗?一个比另一个有什么优势?
我有一个严重的问题。在 Android 中调用 requestLocationUpdates 函数时,GPS 会监听当前位置。但如果手机在室内(比如地下),则 GPS 将继续监听,直到固定位置。 这会
我试图通过 Android 中的 GPS 定期获取用户位置并将数据发送到远程数据库,但我得到异常:无法在未调用 Looper.prepare 的线程内创建处理程序( )。 检索位置的方法在远程服务中,
我在我的应用程序中使用教程等中的以下代码,以从 GPS(或者如果 GPS 未打开,则网络)获取最佳位置修复,然后我将其显示在文本字段中。 crit = new Criteria(); context
我只需要一次 GPS 中的实际位置。在此代码中,永远不会调用 onLocationChanged,我不明白为什么。正如我所说: mLocationManager.requestLocationUpda
抱歉,我知道这里发生了这样的问题,但我无法在我的代码中解决它们,我是初学者......因此,我试图从 LocationManager 读取 GPS 坐标,但我的代码抛出“无法在未调用 Looper.p
我有一个获取 GPS 坐标的简单类 GPSListener: public class GPSListener implements LocationListener { public static
这就是 requestLocationUpdates 的样子(我使用它的方式): requestLocationUpdates(String provider, long minTime, float
我需要将 requestLocationUpdates() 放在一个单独的线程中,以免它阻塞我应用程序的其余部分(它将在大部分时间运行)。最好的方法是什么? 最佳答案 当您调用 requestLoca
如何更新时间和距离间隔,或者以不同的间隔再次调用 requestLocationUpdates? 我的代码: LocationManager locationManager = (LocationMa
(这是关于android中的LocationManager类) 是否有一种使用requestLocationUpdates 的方法,但在某种程度上允许它每次都为我提供最佳 Activity 提供者的结
请告诉我一件事 这是请求位置更新的两种变体 Criteria mFineCriteria = new Criteria(); mFineCriteria.setAccuracy(Criteria.AC
我只有一台设备 (HTC HD Deside) 用于测试我的应用程序以及何时需要使用 locationManager.requestLocationUpdate(criteria,0,0,this);
从 LocationManager 调用 requestLocationUpdates 是否会更新 getLastLocation 返回的位置? 即,我可以这样做吗: 调用 getLastLocati
我是一名优秀的程序员,十分优秀!