Задать вопрос

Геолокация GPS в потоке?

Задача стоит в том, чтобы в отдельном потоке определить координаты, а дальше через синхронизацию вернуть координаты в глобальную переменную. Без потока код отлично работал, а в потоке не хочет. Запрос на доступ к данным геолокации поступает, нажимаю разрешить доступ, а дальше приложение вырубается, при этом, в андроид студие, ошибок нет, все компилится удачно. Я в андроид ява программировании, профан, мне нужна помощь.

package com.example.getlocation;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Поток определения локации
        Thread MyThread = new Thread(MyGetLocationThread);
        MyThread.start();
    }

    // Поток определения локации
    Runnable MyGetLocationThread = new Runnable() {
        public void run() {
            LocationListener myLocationListener;
            LocationManager myLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            int PERMISSION_REQUEST = 1;

            myLocationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    double Longitude = location.getLongitude(); // Долгота
                    double Latitude = location.getLatitude(); // Широта
                    System.out.println(Double.toString(Latitude)+"  --  "+Double.toString(Longitude));
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {
                    //To change body of implemented methods use File | Settings | File Templates.
                }

                @Override
                public void onProviderEnabled(String s) {
                    //To change body of implemented methods use File | Settings | File Templates.
                }

                @Override
                public void onProviderDisabled(String s) {
                    //To change body of implemented methods use File | Settings | File Templates.
                }
            };

            // Запрос разрешения у пользователя на доступ к локации
            // this был заменен на MainActivity.this
            if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)==-1){
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST);
            }
            myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, myLocationListener);
        }
    };

}


Пожалуйста, обратите внимание, что я плохо знаком с ява программированием, я надеюсь на точный ответ, что и где переписать, исправиь. Зарание спасибо.
  • Вопрос задан
  • 181 просмотр
Подписаться 3 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@Dmtm
Android
примерно так
override void onResume(..)  { //повторные запуски после того как пермишен выдан
// Запрос разрешения у пользователя на доступ к локации
            // this был заменен на MainActivity.this
            if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)==-1){
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST);
            } else {
                   if (thread == null ) {
                          thred = new Thread
                    }
            }
}
override fun onRequestPermissionsResult (...) {
//если пермишен только что выдан то
  if (thread == null ) {
                          thred = new Thread
                    }

по if (thread == null ) защищаемся от повторного запуска
Ответ написан
Комментировать
@m0t0d0r Автор вопроса
Нашёл пробемму

package com.example.getlocation;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Looper;

public class MainActivity extends AppCompatActivity {
    int PERMISSION_REQUEST = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Получаем права на доступ к локацие
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)==-1){
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST);
            System.out.println("  --  УПС");
        }
        // Как дождаться принятия решения пользователем?

        //Поток определения локации
        Thread MyThread = new Thread(MyGetLocationThread);
        MyThread.start();
    }

    // Поток определения локации
    Runnable MyGetLocationThread = new Runnable() {
        public void run() {
            Looper.prepare();
            LocationListener myLocationListener;
            LocationManager myLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            myLocationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    double Longitude = location.getLongitude(); // Долгота
                    double Latitude = location.getLatitude(); // Широта
                    System.out.println(Latitude+"  --  "+Longitude);
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {
                    //To change body of implemented methods use File | Settings | File Templates.
                }

                @Override
                public void onProviderEnabled(String s) {
                    //To change body of implemented methods use File | Settings | File Templates.
                }

                @Override
                public void onProviderDisabled(String s) {
                    //To change body of implemented methods use File | Settings | File Templates.
                }
            };

            // Запрос разрешения у пользователя на доступ к локации
            // this был заменен на MainActivity.this
            if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)==0){
                myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, myLocationListener);
            }
            Looper.loop();
        }
    };

}


Надо было лупер повешать

Есть ещё вопрос

// Получаем права на доступ к локацие
        if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)==-1){
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST);
            System.out.println("  --  УПС");
        }
        // Как дождаться принятия решения пользователем?


Упс выполняется не линейно, тоесть, я ещё на принял решение по запросу requestPermissions, а приложение уже идет работать дальше. Не ждёт ответа от пользователя. Может кто знает, как приостановить программу, до момента принятия решения. Спасибо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы