Приложение cra sh во второй раз запуска в реальном устройстве, когда я использую LocationManager.getLastKnowLocation () - PullRequest
0 голосов
/ 12 февраля 2020

Когда я запускаю приведенный ниже код в эмуляторе, он работает совершенно нормально. Но когда я запускаю его на реальном устройстве, он продолжает падать, и он может работать редко (почти все время, когда он работает при первом запуске, когда я переустанавливал). Но когда я пропускаю строки кода, которые относятся к местоположению, он работает нормально (Я указываю их с //** каждой строкой). Я только что изучил Android разработку за 1 месяц, поэтому я сделал много ошибок. Теперь мне действительно нужно узнать широту и долготу текущего местоположения. Пожалуйста, помогите мне). Кстати, реальное устройство Redmi 8 Android 9

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    GetCityName = findViewById(R.id.get_city_name);
    CityName = findViewById(R.id.city_name);
    temperature = findViewById(R.id.temperature);
    //**if (ContextCompat.checkSelfPermission(this, PERMISSION_STRING) != PackageManager.PERMISSION_GRANTED){
        //**ActivityCompat.requestPermissions(this, new String[]{PERMISSION_STRING}, 6699);
    //**}

    //**final LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    //**final String Gps_provider = lm.getBestProvider(new Criteria(), true);
    //**final Location location = lm.getLastKnownLocation(Gps_provider);
    GetCityName.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //*String longgg = String.valueOf(location.getLongitude());
            //*String lattt = String.valueOf(location.getLatitude());
           api_key(lattt,longgg);


        }
    });
}//get the weather data with current latitude and longtitude
private void api_key(String Lat,String Longg) {
    OkHttpClient client=new OkHttpClient();

    Request request=new Request.Builder()
            .url("https://api.openweathermap.org/data/2.5/weather?lat="+Lat+"&lon="+Longg+"&appid=a6f41d947e0542a26580bcd5c3fb90ef&units=metric")
            .get()
            .build();
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    try {
        Response response= client.newCall(request).execute();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String responseData= response.body().string();
                try {
                    JSONObject json=new JSONObject(responseData);
                    String name = json.getString("name");
                    JSONObject temp1= json.getJSONObject("main");
                    String Temperature=String.valueOf(temp1.getDouble("temp"));


                    setText(CityName,name);
                    setText(temperature, Temperature);





                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }catch (IOException e){
        e.printStackTrace();
    }

}//This simply use to set text to TextView
private void setText(final TextView text, final String value){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            text.setText(value);
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Вы должны запросить у пользователя разрешение на определение местоположения, прежде чем вызывать менеджер местоположения, определение разрешения в манифесте - это просто способ сообщить системе Android, что мне нужно разрешение на местоположение, но вы должны запросить его через java код один раз.

0 голосов
/ 12 февраля 2020

Вы запрашивали разрешение на местоположение в своем коде? Я думаю, что вы пропустите эти, и это будет единственной причиной, чтобы взломать sh на реальном устройстве. проверьте эту ссылку, если вы перейдете по этой ссылке, я уверен, что ваша проблема будет исправлена ​​

https://developer.android.com/training/location/retrieve-current

...