【问题标题】:requestLocationUpdates() effect of parameters changed Gingerbread to ICS?requestLocationUpdates() 参数的影响将 Gingerbread 更改为 ICS?
【发布时间】:2012-04-08 23:00:58
【问题描述】:

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

从 SDK 文档中了解到,这些只是“提示”,我编写了自己的电池节约机制,将 GPS 控制委托给具有 IBinder 的服务,活动可以绑定到并通过 BroadcastReceiver 接收位置更新.一个“设置”菜单选项活动设置参数(“GPS 睡眠时间”和“所需精度”,一旦满足精度标准,它将关闭服务中的 GPS 睡眠时间。为了完整性,我还传入了 minTime 和 minDistance 参数,根据我的经验证据,我认为这是多余的。我已尽力在应用程序的帮助页面之一中解释这些设置的效果:

现在我的手机刚刚升级到 ICS,我确实发现 minTime 确实会影响 GPS 的状态(至少正如状态栏上的卫星图标所反映的那样)。事实上,它在修复后几乎完全消失了。

我现在很困惑,不知道对任何特定设备/操作系统版本组合有什么期望,以及如何调整我的应用程序来应对。为了尝试解决它,我会问两个具体问题:

从 Gingerbread 更改为 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 gps


    【解决方案1】:

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

    我相信我已将问题范围缩小到有缺陷的能力 从原生代码向 Android 中的 GpsLocationProvider 报告 平台。在同一个 Nexus S 4G 上的自定义 AOSP 构建中,我硬编码 GpsLocationProvider 中的值以指示本机代码是 无法处理 GPS 调度。瞧,平台接管了 并正确遵循 minTime 参数(在这种情况下为 60 秒) 并每隔 60 秒将位置更新发送到应用程序。 所以,在我看来,本机代码告诉平台“我可以 处理 GPS 调度”,但它没有,导致 1Hz 更新 无论应用程序请求的 minTime 间隔如何。

    【讨论】:

    • 谢谢,这是一个有趣的链接。这是我所描述的行为的第一个佐证。
    • 没问题,无意中发现的,记得stackoverflow上有一个关于它的问题;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多