Android requestLocationUpdates()参数将姜饼更改为ICS的效果?

Android requestLocationUpdates()参数将姜饼更改为ICS的效果?,android,gps,Android,Gps,我已经编写了一个使用GPS的地图应用程序。在我的手机(运行姜饼的Galaxy S2)上测试,根据minTime和MindDistance参数中设置的值,我看不到行为上的任何变化-GPS,如系统图标所示,在修复后,无论设置了什么minTime,都会保持不变 从SDK文档中了解到,这些只是“提示”,我编写了自己的电池保护机制,将GPS控制权委托给带有IBinder的服务,活动可以绑定到该服务,并通过广播接收器接收位置更新。“设置”菜单选项“活动设置参数”(“GPS睡眠时间”和“所需精度”,一旦满足精

我已经编写了一个使用GPS的地图应用程序。在我的手机(运行姜饼的Galaxy S2)上测试,根据minTime和MindDistance参数中设置的值,我看不到行为上的任何变化-GPS,如系统图标所示,在修复后,无论设置了什么minTime,都会保持不变

从SDK文档中了解到,这些只是“提示”,我编写了自己的电池保护机制,将GPS控制权委托给带有IBinder的服务,活动可以绑定到该服务,并通过广播接收器接收位置更新。“设置”菜单选项“活动设置参数”(“GPS睡眠时间”和“所需精度”,一旦满足精度标准,将在睡眠时间内关闭服务中的GPS。为了完整性,我还传入了minTime和MindDistance参数,基于我的经验证据,我认为这是多余的。我尽我所能在其中一个例子中解释这些设置的影响应用程序的帮助页面:

现在我的手机刚刚升级到ICS,我发现minTime确实会影响GPS的状态(至少是状态栏上的卫星图标所反映的)。事实上,它几乎在修复后的设定时间内消失

我现在很困惑,对于任何特定的设备/操作系统版本组合会带来什么,以及如何调整我的应用程序以应对这种情况。为了尝试解决这个问题,我会问两个具体的问题:

从姜饼改为ICS时,有没有开发人员在他们的设备中观察到这样的行为变化?

这样的变化是否有记录在案?

所有基于事实的答案将不胜感激

4月3日更新-我能产生的最小代码示例,用于演示下面附加的设备行为

public class GPSParamTestActivity extends Activity implements LocationListener,
        GpsStatus.Listener {

    private LocationManager mLocMgr;
    private long mUpdatePeriod = 10000; // 10 seconds
    private TextView mLocTV,  mStatTV, mGPSStatTV; // 3 TextViews for o/p
    private boolean mStatColourToggle, mLocnColourToggle, mGPSStatColourToggle;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // Layout at http://dl.dropbox.com/u/67134160/main.xml if needed
    }

    @Override
    protected void onResume() {
        super.onResume();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        mLocTV = (TextView) findViewById(R.id.locnTV);
        mStatTV = (TextView) findViewById(R.id.statusTV);
        mGPSStatTV = (TextView) findViewById(R.id.gpsStatusTV);
        mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
    }

    @Override
    protected void onPause() {
        mLocMgr.removeGpsStatusListener(this);
        mLocMgr.removeUpdates(this); // Don't leave GPS on 
        super.onPause();
    }

    @Override
    public void onGpsStatusChanged(int event) {// GpsStatus.Listener fires this one
        mGPSStatTV.setTextColor(mGPSStatColourToggle ? Color.RED : Color.BLUE);
        mGPSStatColourToggle = !mGPSStatColourToggle;
        String str = "";
        switch (event) {
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                str = "GPS_EVENT_SATELLITE_STATUS";
                break; 
            case GpsStatus.GPS_EVENT_FIRST_FIX:
                str = "GPS_EVENT_FIRST_FIX";
                break;
            case GpsStatus.GPS_EVENT_STARTED:
                str = "GPS_EVENT_STARTED";
                break;
            case GpsStatus.GPS_EVENT_STOPPED:
                str = "GPS_EVENT_STOPPED";
                break;
        }
        mGPSStatTV.setText(str);
    }

    @Override
    public void onLocationChanged(Location loc) {
        mLocTV.setTextColor(mLocnColourToggle ? Color.RED : Color.BLUE);
        mLocnColourToggle = !mLocnColourToggle;
        String str = null;
        NumberFormat formatter = new DecimalFormat("##0.000000");
        String fLat = formatter.format(loc.getLatitude());
        String fLon = formatter.format(loc.getLongitude());
        str = "Lat/Lon " + fLat + "/" + fLon;
        mLocTV.setText(str);
    }

    @Override public void onProviderDisabled(String provider) {}
    @Override public void onProviderEnabled(String provider) {}

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // This is never triggered on a Galaxy S2, G'bread or ICS
        mStatTV.setTextColor(mStatColourToggle ? Color.RED : Color.BLUE);
        mStatColourToggle = !mStatColourToggle;
        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";
        }
        mStatTV.setText(str);
    }

    public void myClickHandler(View target) {
        mLocMgr.removeGpsStatusListener(this); // stop all listeners
        mLocMgr.removeUpdates(this);           // by default 
        // 3 buttons for app control, set the listeners to here in the XML
        switch (target.getId()) {
            case R.id.stopGPSButton:
                break; // already done by default
            case R.id.tenSecStartButton:
                mLocMgr.addGpsStatusListener(this);
                mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                        mUpdatePeriod, 0, (LocationListener) this);
                break;
            case R.id.zeroSecStartButton:
                mLocMgr.addGpsStatusListener(this);
                mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                        0, 0, (LocationListener) this);
                break;
        }
    }
}

.

虽然这不是一篇真正的答题文章,但它可能很有趣:

我相信我已经把问题缩小到了能力缺陷 从本机代码向Android中的GpsLocationProvider报告 在同一Nexus S 4G上的定制AOSP构建中,我硬编码了 GpsLocationProvider中的值,以指示本机代码 无法处理GPS调度。瞧,平台接管了 并正确遵循minTime参数(本例中为60秒) 并每隔60秒向应用程序发送位置更新。 因此,在我看来,本机代码告诉平台“我可以” 处理GPS调度”,但随后它没有,导致1Hz更新 无论应用程序请求的最小时间间隔是多少,都要进行速率调整


虽然这不是一个真正的答案,但帖子可能很有趣:

我相信我已经把问题缩小到了能力缺陷 从本机代码向Android中的GpsLocationProvider报告 在同一Nexus S 4G上的定制AOSP构建中,我硬编码了 GpsLocationProvider中的值,以指示本机代码 无法处理GPS调度。瞧,平台接管了 并正确遵循minTime参数(本例中为60秒) 并每隔60秒向应用程序发送位置更新。 因此,在我看来,本机代码告诉平台“我可以” 处理GPS调度”,但随后它没有,导致1Hz更新 无论应用程序请求的最小时间间隔是多少,都要进行速率调整


谢谢,这是一个有趣的链接。这是我第一次看到我所描述的行为的佐证。没问题,是偶然发现的,并且记得有一个关于stackoverflow的问题;)谢谢,这是一个有趣的链接。这是我第一次看到我所描述的行为的佐证。没问题,是偶然发现的,并且记得有一个关于stackoverflow的问题;)