Вставить текущее местоположение в базе данных из Android с помощью POST-сервиса из весны - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть служба POST в Java Spring, и я хочу использовать ее, чтобы взять текущее местоположение из клиента Android и вставить в базу данных mysql.Мой POST-сервис протестирован на swagger и работает нормально.В Android у меня есть следующий код:

public class SendActivity extends AppCompatActivity implements View.OnClickListener {
    private Executor executor = Executors.newFixedThreadPool(1);
    private LocationManager locationManager;
    private String provider;
    private static final int REQUEST_LOCATION = 1;
    TextView textView;
    private volatile Handler msgHandler;

    private static final String STATIC_LOCATION =
            "{" +
                    "\"terminalId\":\"%s\"," +
                    "\"latitude\":\"%s\"," +
                    "\"longitude\":\"%s\"" +
                    "}";

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

        textView = (TextView) findViewById(R.id.text_location);

        Button sendButton = findViewById(R.id.button_location);
        sendButton.setOnClickListener(this);

        msgHandler = new MsgHandler(this);

    }

    public void onClick(View v) {
        executor.execute(new Runnable() {
            public void run() {
                Message msg = msgHandler.obtainMessage();
                // use MAC addr or IMEI as terminal id
                // read true position
                // replace static coordinates with the ones from the true position
                 msg.arg1 = sendCoordinates("123456", "23.25", "45.02") ? 1 : 0;
                msgHandler.sendMessage(msg);

            }


        });
    }

    private boolean sendCoordinates(String terminalId, String lattitude, String longitude) {
        HttpURLConnection con = null;
        try {

            if (ActivityCompat.checkSelfPermission(SendActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
                    (SendActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(SendActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);

            } else {
                Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                Location location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                Location location2 = locationManager.getLastKnownLocation(LocationManager. PASSIVE_PROVIDER);

                if (location != null) {
                    double latti = location.getLatitude();
                    double longi = location.getLongitude();
                    lattitude = String.valueOf(latti);
                    longitude = String.valueOf(longi);

                    textView.setText("Your current location is"+ "\n" + "Lattitude = " + lattitude
                            + "\n" + "Longitude = " + longitude);

                } else  if (location1 != null) {
                    double latti = location1.getLatitude();
                    double longi = location1.getLongitude();
                    lattitude = String.valueOf(latti);
                    longitude = String.valueOf(longi);

                    textView.setText("Your current location is"+ "\n" + "Lattitude = " + lattitude
                            + "\n" + "Longitude = " + longitude);


                } else  if (location2 != null) {
                    double latti = location2.getLatitude();
                    double longi = location2.getLongitude();
                    lattitude = String.valueOf(latti);
                    longitude = String.valueOf(longi);

                    textView.setText("Your current location is"+ "\n" + "Lattitude = " + lattitude
                            + "\n" + "Longitude = " + longitude);

                }else{

                    Toast.makeText(this,"Unble to Trace your location",Toast.LENGTH_SHORT).show();

                }
            }

            URL obj = new URL("http://192.168.0.102:8085/position/send");
            con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("User-Agent", "Mozilla/5.0");
            con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

            con.setDoOutput(true);
            OutputStream os = con.getOutputStream();
            os.write(String.format(STATIC_LOCATION, terminalId, lattitude, longitude).getBytes());
            os.flush();
            os.close();

            int responseCode = con.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) { //success
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        con.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }

                in.close();

                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
//            e.printStackTrace();
            return false;
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
    }

    private static class MsgHandler extends Handler {
        private final WeakReference<Activity> sendActivity;

        public MsgHandler(Activity activity) {
            sendActivity = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            if (msg.arg1 == 1) {
                Toast.makeText(sendActivity.get().getApplicationContext(),
                        "Success!", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(sendActivity.get().getApplicationContext(),
                        "Error!", Toast.LENGTH_LONG).show();
            }
        }
    }
}

Я знаю, что мои переменные "String TerminalId, String latitude" перезаписываются, но этот метод является тестовым.Каждый раз, когда я запускаю его, я получаю следующее сообщение об ошибке:

Toast.makeText(sendActivity.get().getApplicationContext(),
                        "Error!", Toast.LENGTH_LONG).show();

Мне нужна небольшая помощь с этим кодом, потому что я не знаю, почему приложение не работает.

1 Ответ

0 голосов
/ 08 декабря 2018

прошлой ночью я трачу много времени на решение этой проблемы.И я решил проблему, проблема в том, когда я пытаюсь взять местоположение GPS из потока:

private Executor executor = newFixedThreadPool(1);

, более точно в метоне:

private boolean sendCoordinates(String terminalId, String lattitude, String longitude)

, который вызывается в потоке:

executor.execute(new Runnable() {
            public void run() {
                Message msg = msgHandler.obtainMessage();
                 msg.arg1 = sendCoordinates("123456", "23.25", "45.02") ? 1 : 0;
                msgHandler.sendMessage(msg);
            }
        });

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

private void getLocation() {
        if (ActivityCompat.checkSelfPermission(SendActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
                (SendActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(SendActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);

        } else {
            Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            Location location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

            Location location2 = locationManager.getLastKnownLocation(LocationManager. PASSIVE_PROVIDER);

            if (location != null) {
                double latti = location.getLatitude();
                double longi = location.getLongitude();
                lattitude = String.valueOf(latti);
                longitude = String.valueOf(longi);

                textView.setText(lattitude);
                textView1.setText(longitude);

            } else  if (location1 != null) {
                double latti = location1.getLatitude();
                double longi = location1.getLongitude();
                lattitude = String.valueOf(latti);
                longitude = String.valueOf(longi);

                textView.setText(lattitude);
                textView1.setText(longitude);


            } else  if (location2 != null) {
                double latti = location2.getLatitude();
                double longi = location2.getLongitude();
                lattitude = String.valueOf(latti);
                longitude = String.valueOf(longi);

                textView.setText(lattitude);
                textView1.setText(longitude);

            }else{

                Toast.makeText(this,"Unble to Trace your location",Toast.LENGTH_SHORT).show();

            }
        }
    }

и после этого измененияметод sendCoordinates:

private boolean sendCoordinates(String terminalId, String lat, String lng) {
        HttpURLConnection con = null;
        try {
            URL obj = new URL("http://192.168.0.102:8085/position/send");
            con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("User-Agent", "Mozilla/5.0");
            con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

            con.setDoOutput(true);
            OutputStream os = con.getOutputStream();
            os.write(String.format(STATIC_LOCATION, terminalId, lat, lng).getBytes());
            os.flush();
            os.close();

            int responseCode = con.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) { //success
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        con.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }

                in.close();

                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
//            e.printStackTrace();
            return false;
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
    }

и, наконец, метод onClick:

@Override
public void onClick(View v) {
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        buildAlertMessageNoGps();

    } else if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        getLocation();
    }
    executor.execute(new Runnable() {
        public void run() {
            Message msg = msgHandler.obtainMessage();
            // use MAC addr or IMEI as terminal id
            // read true position
            // replace static coordinates with the ones from the true position
            lat1=textView.getText().toString();
            long1=textView1.getText().toString();
            msg.arg1 = sendCoordinates("999999", lat1, long1) ? 1 : 0;
            msgHandler.sendMessage(msg);

        }


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