请求位置更新参数在Gingerbread设备上无效

3

我之前编写了一个带有位置监听器的应用程序,但没有实际设备来测试。现在我有了一个Gingerbread手机(2.3.3),我的应用程序如预期一样会消耗大量电池。

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

我曾经想知道仅仅调整这些参数如何影响电池消耗,因为据我所见,GPS必须保持开启状态,以便知道设备移动的距离,只有通知应用程序的实际过程会改变,而芯片将继续使用电力。

这篇文章《了解Android中的LocationListener》提出了一个可信的解释,表明状态会变为“暂时不可用”,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);
    }
}

欢迎提出任何评论。

2个回答

5
如果你深入探究GPS提供商的内部,你会发现Android告诉本机驱动程序最小更新时间。然后本机驱动程序可以决定做什么-根据我的经验,它们都不理会这一点,继续全速运行。
这很烦人,但并没有违反javadocs

可以使用minTime和minDistance参数控制通知的频率。如果minTime大于0,则LocationManager可能在位置更新之间休眠minTime毫秒以节省电力。

(强调添加)
解决方案是根据需要注册您的LocationListener。如果您需要针对在requestSingleUpdate添加之前的API,则必须注册侦听器,然后在满意位置质量时注销它。这将关闭GPS并节省电力。

谢谢提供链接。这很有道理,因为我可以将我看到的行为与我提供的链接所报告的行为相协调。本质上,我想一些设备的驱动程序会(或曾经)注意到该参数,而其他设备则不会。如果requestLocationUpdates(..)返回一个结果代码以让您知道参数是否被忽略,那将是很好的。看起来我必须自己编写某种生态友好型的机制了。 - NickT

0

如果您正在聆听GPS,无论您的间隔设置为多少,该图标都将出现在菜单栏中。您的假设是正确的,设置通知时间和距离只会在达到这些阈值时提醒您的应用程序。芯片必须保持开启状态以便在有变化时提醒您。

您的应用程序中需要不断更新GPS的是什么?我通常使用requestSingleUpdate函数来获取GPS位置。


现在看起来它一直开着,但这与我提供的链接中报告的行为不符。如果它一直开着,那么声称更新时间和距离会影响电池使用的文档就是错的。我希望我的应用程序像所有其他GPS应用程序一样运行,不需要requestSingleUpdate,这仅适用于API9。我希望我的应用程序在API7上运行。 - NickT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接