I am trying to run a code that works like a weather app but after writing the code I am getting java null pointer error Here is my MainActivity.java
package com.nishal.wheatherapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.loader.app.LoaderManager;
import androidx.recyclerview.widget.RecyclerView;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.media.Image;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.material.textfield.TextInputEditText;
import com.squareup.picasso.Picasso;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private RelativeLayout homeRl;
private ProgressBar loadingPB;
private TextView cityNameTV,temperatureTV,conditionTV;
private RecyclerView weatherRV;
private TextInputEditText cityEdt;
private ImageView backIV,iconIV,searchIV;
private ArrayList<WeatherRvModel> weatherRvModelArrayList;
private WeatherRVAdapter weatherRVAdapter;
private LocationManager locationManager;
private int PERMISSION_CODE = 1;
private String cityName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
setContentView(R.layout.activity_main);
homeRl = findViewById(R.id.idRLHome);
loadingPB = findViewById(R.id.idPBLoading);
cityNameTV = findViewById(R.id.idTVCityName);
cityEdt = findViewById(R.id.idEdtCity);
temperatureTV = findViewById(R.id.idTVTemparature);
conditionTV = findViewById(R.id.idTVCondition);
weatherRV = findViewById(R.id.idRVweather);
backIV = findViewById(R.id.idIVBack);
iconIV = findViewById(R.id.IVIcon);
searchIV = findViewById(R.id.idIVSearch);
weatherRvModelArrayList = new ArrayList<>();
weatherRVAdapter = new WeatherRVAdapter(this,weatherRvModelArrayList);
weatherRV.setAdapter(weatherRVAdapter);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_CODE);
}
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
cityName = getCityName(location.getLongitude(),location.getLatitude());
getWeatherInfo(cityName);
searchIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String city = cityEdt.getText().toString();
if(city.isEmpty()){
Toast.makeText(MainActivity.this, "Please Enter City Name", Toast.LENGTH_SHORT).show();
}else{
cityNameTV.setText(cityName);
getWeatherInfo(city);
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==PERMISSION_CODE){
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "Permissions Granted", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "Please Provide the Permissions", Toast.LENGTH_SHORT).show();
finish();
}
}
}
private String getCityName(double longitude, double latitude){
String cityName = "Not Found";
Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
try{
List<Address> addresses = gcd.getFromLocation(latitude,longitude,10);
for(Address adr : addresses){
if(adr!=null){
String city = adr.getLocality();
if(city!=null && !city.equals("")){
cityName = city;
}else{
Log.d("TAG","CITY NOT FOUND");
Toast.makeText(this,"User City Not Found..",Toast.LENGTH_SHORT).show();
}
}
}
}catch(IOException e){
e.printStackTrace();
}
return cityName;
}
//City name entry
private void getWeatherInfo(String cityName){
String url = "http://api.weatherapi.com/v1/forecast.json?key=f7d844c25670438f8aa122034230208&q="+ cityName +"&days=1&aqi=yes&alerts=yes";
cityNameTV.setText(cityName);
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
loadingPB.setVisibility(View.GONE);
homeRl.setVisibility(View.VISIBLE);
weatherRvModelArrayList.clear();
try {
String temperature = response.getJSONObject("current").getString("temp_c");
temperatureTV.setText(temperature+"°c");
int isDay = response.getJSONObject("current").getInt("is_day");
String condition = response.getJSONObject("current").getJSONObject("condition").getString("text");
String conditionIcon = response.getJSONObject("current").getJSONObject("condition").getString("icon");
Picasso.get().load("http:".concat(conditionIcon)).into(iconIV);
conditionTV.setText(condition);
if(isDay==1){
//morning
Picasso.get().load("https://unsplash.com/photos/hqvP1DMi0d0").into(backIV);
}else{
//night
Picasso.get().load("https://unsplash.com/photos/rpVQJbZMw8o").into(backIV);
}
JSONObject forecastObj = response.getJSONObject("forecast");
JSONObject forecastO = forecastObj.getJSONArray("forecastday").getJSONObject(0);
JSONArray hourArray = forecastO.getJSONArray("hour");
for(int i=0;i<hourArray.length();i++){
JSONObject hourObj = hourArray.getJSONObject(i);
String time = hourObj.getString("time");
String temper = hourObj.getString("temp_c");
String img = hourObj.getJSONObject("condition").getString("icon");
String wind = hourObj.getString("wind_kph");
weatherRvModelArrayList.add(new WeatherRvModel(time,temper,img,wind));
}
weatherRVAdapter.notifyDataSetChanged();
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "Please Enter valid City Name", Toast.LENGTH_SHORT).show();
}
});
requestQueue.add(jsonObjectRequest);
}
}
I tried all the methods but it is still giving me Attempt to invoke virtual method 'double android.location.Location.getLongitude()' this error
my logcat is
java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLongitude()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)