Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我使用LocationManager.getLastKnowLocation()时,应用程序在真实设备的第二次启动时崩溃_Java_Android_Android Permissions_Okhttp - Fatal编程技术网

Java 当我使用LocationManager.getLastKnowLocation()时,应用程序在真实设备的第二次启动时崩溃

Java 当我使用LocationManager.getLastKnowLocation()时,应用程序在真实设备的第二次启动时崩溃,java,android,android-permissions,okhttp,Java,Android,Android Permissions,Okhttp,当我在模拟器中运行下面的代码时,它工作得非常好。但是,当我在真实设备上运行它时,它会不断崩溃,几乎无法工作(几乎所有的时间都是在我重新安装时第一次启动它时工作)。但是当我省略与位置相关的代码行时,它工作得很好。(我用/**每一行来表示它们)。我刚刚学习Android开发一个月,所以我犯了很多错误。现在我真的需要得到当前位置的纬度和经度。顺便说一下,真正的设备是Redmi 8和Android 9 @Override protected void onCreate(Bundle savedInsta

当我在模拟器中运行下面的代码时,它工作得非常好。但是,当我在真实设备上运行它时,它会不断崩溃,几乎无法工作(几乎所有的时间都是在我重新安装时第一次启动它时工作)。但是当我省略与位置相关的代码行时,它工作得很好。(我用
/**
每一行来表示它们)。我刚刚学习Android开发一个月,所以我犯了很多错误。现在我真的需要得到当前位置的纬度和经度。顺便说一下,真正的设备是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);
        }
    });
}

您是否在代码中请求位置权限?我认为您错过了这些,这将是在实际设备上崩溃的唯一原因。查看此链接 如果你照这个做,我相信你会解决你的问题


在调用位置管理器之前,您必须向用户提示位置权限,在清单中定义权限只是告诉Android系统我需要位置权限的一种方式,但您需要通过java代码请求一次

我已经在AndroidManifest.xml文件中找到了
getLastKnownLocation()
可能会返回null。Android设备不会一直自动跟踪其位置。“最后一个已知位置”仅在某些应用程序请求该位置时可用。因此,您不应该期望总是使用
getLastKnownLocation()
获取位置。即使它返回了一些东西,位置也可能不再是最新的。您应该请求位置更新以获取最新数据。