requestLocationUpdates () Влияние параметров изменено Gingerbread на ICS? - PullRequest
2 голосов
/ 31 марта 2012

Я написал картографическое приложение, которое использует GPS.Тестируя это на моем телефоне (Galaxy S2 с Gingerbread), я не увидел никаких изменений в поведении в соответствии со значениями, установленными в аргументах minTime и minDistance - GPS, как указаноПосле исправления системный значок оставался включенным независимо от того, какое значение minTime было установлено.

Зная из документов SDK, что это всего лишь «подсказки», я написал свой собственный режим сохранения заряда батареи, делегировав управление GPS службеIBinder, к которому действия могут привязываться и получать обновления местоположения с помощью BroadcastReceiver.Параметр меню «Настройки» задает параметры активности («Время ожидания GPS» и «Требуемая точность», которые отключают GPS в службе на время ожидания после выполнения критерия точности. Для полноты я также передал параметры minTime и minDistance)., который, исходя из моих эмпирических данных, которые я предположил, будет излишним. Я приложил все усилия, чтобы объяснить влияние этих настроек на одной из страниц справки приложения:

enter image description here

Теперь мой телефонтолько что был обновлен до ICS, я делаю обнаружил, что minTime влияет на состояние GPS (по крайней мере, как это отражается на значке спутника в строке состояния). Фактически он исчезает почти точноустановить время после исправления.

Сейчас я нахожусь в затруднительном положении относительно того, что ожидать от любой конкретной комбинации устройства / версии ОС и как адаптировать мое приложение, чтобы справиться. Чтобы попытаться решить это, я попрошудва конкретных вопроса:

Наблюдал ли какой-либо разработчик такое изменение поведения в своем устройстве при сменеg от Gingerbread до ICS?

Задокументировано ли такое изменение где-нибудь?

Будут признательны за все ответы на основе фактических данных.

ОБНОВЛЕНИЕ 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;
        }
    }
}

.

1 Ответ

4 голосов
/ 08 апреля 2012

Хотя это не настоящий ответ эта публикация может быть интересной:

Я считаю, что я сузил проблему до сообщения о неисправной возможности из нативного кода в GpsLocationProvider вплатформа Android.В пользовательской сборке AOSP на том же Nexus S 4G я жестко закодировал значения в GpsLocationProvider, чтобы указать, что собственный код НЕ способен обрабатывать планирование GPS.Вуаля, платформа взяла верх и должным образом следовала параметру minTime (в данном случае 60 секунд) и доставила обновления местоположения в приложение с интервалом в 60 секунд.Таким образом, мне кажется, что нативный код сообщает платформе «Я могу управлять планированием GPS», но это не так, что приводит к частоте обновления 1 Гц независимо от интервала minTime, запрошенного приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...