Как делать чтоб при свернутом состоянии телефон определял место положение?

315
11 января 2017, 00:32

Всем привет!Есть приложение которое отправляет данные на удаленную БД MySQL.Все было прекрасно пока не начал тестировать в реальном времени ,вроде все и работает .но стоит свернуть приложение или поставить экран на блок то приложение перестает посылать данные на сервер.Почему ?Я сейчас выложу код прошу мне помочь.Я хочу понять когда телефон свернут он не определяет местоположение или не отправляет их .Или когда свернут вообще перестает функционировать.Как мне быть чтоб посоветовали?Спасибо всем. Прошу вот мой кусок кода

   public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
     protected static final int REQUEST_CHECK_SETTINGS = 0x1;
        private FusedLocationProviderApi locationProvider = LocationServices.FusedLocationApi;
        private GoogleApiClient googleApiClient;
        private LocationRequest locationRequest;
    private Double myLatitude;
    private Double myLongitude;
....

Это мой onCreat в котором полученные данные посылаются через поток.

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    googleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        locationRequest = new LocationRequest();
        locationRequest.setInterval(10 * 1000);
        locationRequest.setFastestInterval(15 * 1000);
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);


    final TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                int i=0;
                i++;
                System.out.println("Request  N +" +i);
                Sender s=new Sender(MainActivity.this,urlAddress,lat,lot);
                s.execute();
            }
        };
         final Timer timer =new Timer();

Это слушатель после нажатия он через определенный интервал посылает данные в потоке .

 saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
           //timer.scheduleAtFixedRate(timerTask,0,3000);
                timer.scheduleAtFixedRate(timerTask,0,8000);
            }
        });
    }

Ну а вот и код получения

 @Override
    public void onConnected(Bundle bundle) {
        requestLocationUpdates();
    }

    private void requestLocationUpdates() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(),"Connect on",Toast.LENGTH_LONG).show();
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
    }
    @Override
    public void onConnectionSuspended(int i) {
    }
    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
    }


    @Override
    public void onLocationChanged(Location location) {
        myLatitude = location.getLatitude();
        myLongitude = location.getLongitude();
        lat.setText(String.valueOf(myLatitude));
        lot.setText(String.valueOf(myLongitude));
 }
    public Double getMyLatitude(){
        return myLatitude;
    }
    public  String getLong(){
        return lot.getText().toString();
    }
    public void settingsrequest()
    {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(1 * 1000);
        locationRequest.setFastestInterval(1 * 1000);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true); //this is the key ingredient
        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult result) {
                final Status status = result.getStatus();
                final LocationSettingsStates state = result.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location
                        // requests here.
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied. But could be fixed by showing the user
                        // a dialog.
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
                        break;
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        requestLocationUpdates();
                        Toast.makeText(getApplicationContext(),"Gps turn on",Toast.LENGTH_LONG).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        settingsrequest();//keep asking if imp or do whatever
                        break;
                }
                break;
        }
    }
    @Override
    protected void onStart() {
        super.onStart();
        settingsrequest();
        googleApiClient.connect();
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (googleApiClient.isConnected()) {
            requestLocationUpdates();
        }
    }
    @Override
    protected void onPause() {
        super.onPause();
        LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
    }
    @Override
    protected void onStop() {
        super.onStop();
        googleApiClient.disconnect();
    }


}

И вот мой Manifiest

 <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Благодарю!

Answer 1

Я хочу понять когда телефон свернут он не определяет местоположение или не отправляет их .Или когда свернут вообще перестает функционировать.Как мне быть чтоб посоветовали?

Советую воспользоваться отладкой.

Или когда свернут вообще перестает функционировать.

Делаешь какой-нибудь таймер и в глобальный массив накидываешь время его вызова. По нажатию на кнопку отображаешь массив в каком-нибудь списке. Теперь запускаешь это, сворачиваешь приложение на некоторое время (желательно подольше), разворачиваешь и жмёшь кнопку.

  • Если всё время, пока приложение было свёрнуто, отсутствует в массиве, то оно вообще перестаёт функционировать.
  • Если там вообще ничего нет, значит кто-то выгрузил приложение из памяти (или закрыл).
  • Если есть с увеличением интервала, значит оно "замедляется".
  • Если есть как и при несвёрнутом, значит всё шикарно и проблема в чём-то другом.

Можно вместо глобального массива попробовать запись в файл или ещё куда-то. Но это относится скорее ко второму варианту, если надо понять, что там происходит.

или не отправляет их

По таймеру отправляешь что-то на сервер. Если приходить перестало, значит либо не отправляет, либо см. прошлый пункт.

он не определяет местоположение

Как в первом и втором пунктах, только по результатам определения местоположения.

Ну или какой-нибудь try-catch, хотя такой проблемы, вероятно, нет?

Answer 2

Вероятнее всего, вы столкнулись с Doze Mode.

https://developer.android.com/training/monitoring-device-state/doze-standby.html

Зайдите в настройки -> батарея -> экономия заряда батареи -> все приложения, найдите ваше и отключите экономию. Если это поможет - причина найдена. Тогда учите приложение запрашивать у пользователя добавление в white list.

intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivity(intent);
Answer 3

Сейчас сохранение и координат у вас происодит в активности, и зависит от жизненного цикла активности. Поэтому вам нужно перенести код получения координат и их сохранение в сервисы (Service), чтобы ваша задача продолжала работать, даже когда приложение закрыто

Answer 4

Выносите определение координат в IntentService и определяйте себе на здоровье. Оттуда уже можно будет передавать в Activity (когда Activity оживет естественно). Передачу данных из сервиса можно осуществлять либо через LocalBroadcast либо через IBinder

READ ALSO
Адаптивность сайта на Iphone и ipad

Адаптивность сайта на Iphone и ipad

Уже не в первый раз сталкиваюсь с проблемой адаптивности на iphone и ipadНапример есть сайт: http://iphone

613
Смена картинки в зависимости от value select

Смена картинки в зависимости от value select

Ситуация такая: есть 2 селектa, в первом тип машины, во втором модель машиныЗначения во втором селекте меняются в зависимости от выбора в первом...

456