Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Android 获取纬度和经度?_Android_Google Maps_Android Recyclerview_Geolocation - Fatal编程技术网

Android 获取纬度和经度?

Android 获取纬度和经度?,android,google-maps,android-recyclerview,geolocation,Android,Google Maps,Android Recyclerview,Geolocation,我正在尝试在我的RecyclerView中获取按钮单击的位置 但是,当我点击按钮时,应用程序崩溃,出现了这个错误 日志: java.lang.NullPointerException: Attempt to invoke virtual method 'android.location.Location android.location.LocationManager.getLastKnownLocation(java.lang.String)' on a null object referen

我正在尝试在我的RecyclerView中获取按钮单击的位置

但是,当我点击按钮时,应用程序崩溃,出现了这个错误

日志:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.location.Location android.location.LocationManager.getLastKnownLocation(java.lang.String)' on a null object reference
RecyclerView适配器代码:

public class RecieverAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
Context context;
List<BloodData> data = Collections.emptyList();
List<BloodData> searchData;
LayoutInflater inflater;
RecieverAdapter RAdapter;
LocationManager locationManager;
public RecieverAdapter(RecieveBlood recieveBlood, List<BloodData> data) {
    this.context = recieveBlood;
    inflater = LayoutInflater.from( context );
    this.data = data;
    this.RAdapter = this;
    searchData = new ArrayList<>( data );
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = inflater.inflate( R.layout.blood_list, viewGroup, false );
    MyHolder holder = new MyHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    MyHolder myHolder = (MyHolder) viewHolder;
    BloodData current = data.get( i );
    myHolder.Sr_Num.setText( " "+i );
    myHolder.Donar_Name.setText( "Name : "+current.getD_Name() );
    myHolder.Donar_Blood_Group.setText( "Blood Group : " +current.getD_blood_group());
    myHolder.Donar_Mobile.setText( "Mobile : "+current.getD_Number());
    myHolder.Donar_Gender.setText( "Gender : "+current.getD_Gender());

    myHolder.location1.setOnClickListener( new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getLocation();
        }
    } );

}

void getLocation() {
    if (ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions( (Activity) context, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION}, 101);

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

        if(location != null){
            double lati = location.getLatitude();
            double longi = location.getLongitude();

            Log.e(TAG,"Location :" +lati+ " ,"+longi );
        }
    }
}



@Override
public int getItemCount() {
    return data.size();
}
 private class MyHolder extends  RecyclerView.ViewHolder{
    TextView Sr_Num,Donar_Name,Donar_Blood_Group,Donar_Mobile,Donar_Gender;
    Button location1, location2;
    public MyHolder(@NonNull View itemView) {
        super( itemView );

        Sr_Num = (TextView) itemView.findViewById( R.id.sr_number );
        Donar_Name = (TextView) itemView.findViewById( R.id.Donar_Name );
        Donar_Blood_Group  =(TextView) itemView.findViewById( R.id.Donar_blood_Group);
        Donar_Mobile = (TextView) itemView.findViewById( R.id.Donar_Number );
        Donar_Gender = (TextView) itemView.findViewById( R.id.Donar_Gender );
        location1 = (Button) itemView.findViewById( R.id.Location1 );
        location2 = (Button) itemView.findViewById( R.id.location2 );


    }
}
}
公共类ReceiveAdapter扩展了RecyclerView。适配器实现可过滤{
语境;
List data=Collections.emptyList();
列出搜索数据;
充气机;
接收适配器雷达;
地点经理地点经理;
公共ReceiveAdapter(ReceiveBlood ReceiveBlood,列表数据){
this.context=receiveblood;
充气器=充气器。从(上下文);
这个数据=数据;
this.RAdapter=这个;
searchData=新的ArrayList(数据);
}
@非空
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
视图=充气机。充气(R.layout.blood\u列表,视图组,false);
MyHolder=新的MyHolder(视图);
报税表持有人;
}
@凌驾
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder ViewHolder,int i){
MyHolder MyHolder=(MyHolder)viewHolder;
当前血液数据=数据获取(i);
myHolder.Sr_Num.setText(“+i”);
myHolder.Donar_Name.setText(“Name:+current.getD_Name());
myHolder.Donar_Blood_Group.setText(“血型:+current.getD_Blood_Group());
myHolder.Donar_Mobile.setText(“Mobile:+current.getD_Number());
myHolder.Donar_-Gender.setText(“性别:+current.getD_-Gender());
myHolder.location1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
getLocation();
}
} );
}
void getLocation(){
if(ContextCompat.checkSelfPermission(context,android.Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u授予和&ActivityCompat.checkSelfPermission(context,android.Manifest.permission.ACCESS\u授予)!=PackageManager.permission\u授予){
ActivityCompat.requestPermissions((活动)上下文,新字符串[]{android.Manifest.permission.ACCESS\u FINE\u LOCATION,android.Manifest.permission.ACCESS\u rough\u LOCATION},101);
}否则{
Location Location=locationManager.getLastKnownLocation(locationManager.NETWORK\u提供程序);
如果(位置!=null){
双纬度=location.getLatitude();
double longi=location.getLongitude();
Log.e(标签,“位置:“+lati+”,“+longi”);
}
}
}
@凌驾
public int getItemCount(){
返回data.size();
}
私有类MyHolder扩展了RecyclerView.ViewHolder{
TextView Sr_Num、捐赠者姓名、捐赠者血型、捐赠者手机、捐赠者性别;
按钮位置1,位置2;
公共MyHolder(@NonNull View itemView){
超级(项目视图);
Sr_Num=(TextView)itemView.findViewById(R.id.Sr_编号);
Donar_Name=(TextView)itemView.findViewById(R.id.Donar_Name);
Donar_Blood_Group=(TextView)itemView.findViewById(R.id.Donar_Blood_Group);
Donar_Mobile=(TextView)itemView.findViewById(R.id.Donar_编号);
Donar_性别=(TextView)itemView.findViewById(R.id.Donar_性别);
location1=(按钮)itemView.findViewById(R.id.location1);
location2=(按钮)itemView.findViewById(R.id.location2);
}
}
}
我设置了该位置所需的所有权限

Android MainFest文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="nikhil.bloodbank.bloodsupplies">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

因此,每当我点击按钮时,应用程序就会崩溃,给我这个错误。
我还手动检查了权限是否已授予。

您尚未初始化location manager实例。 更改适配器构造函数,如下所示:

public RecieverAdapter(RecieveBlood recieveBlood, List<BloodData> data) {
    this.context = recieveBlood;
    inflater = LayoutInflater.from( context );
    this.data = data;
    this.RAdapter = this;
    searchData = new ArrayList<>( data );

    //Initialize Location manager
    locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
}
fetchCurrentLocation() {
        try {
                LocationListener locationListener = new LocationListener() {
                    @Override
                    public void onLocationChanged(final Location location) {
                        if (location != null) {
                            locationManager.removeUpdates(this);
                            double lati = location.getLatitude();
                            double longi = location.getLongitude();
                            Log.e(TAG,"Location :" +lati+ " ,"+longi );
                        }
                    }

                    @Override
                    public void onProviderDisabled(String s) {
                        locationManager.removeUpdates(this);
                    }

                    @Override
                    public void onStatusChanged(String s, int i, Bundle bundle) {
                    }

                    @Override
                    public void onProviderEnabled(String s) {
                    }
                };

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500L,30f, locationListener);
            } catch (SecurityException e) {
                e.printStackTrace();
            }
}
您应该实现locationListener,如下所示:

public RecieverAdapter(RecieveBlood recieveBlood, List<BloodData> data) {
    this.context = recieveBlood;
    inflater = LayoutInflater.from( context );
    this.data = data;
    this.RAdapter = this;
    searchData = new ArrayList<>( data );

    //Initialize Location manager
    locationManager = (LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
}
fetchCurrentLocation() {
        try {
                LocationListener locationListener = new LocationListener() {
                    @Override
                    public void onLocationChanged(final Location location) {
                        if (location != null) {
                            locationManager.removeUpdates(this);
                            double lati = location.getLatitude();
                            double longi = location.getLongitude();
                            Log.e(TAG,"Location :" +lati+ " ,"+longi );
                        }
                    }

                    @Override
                    public void onProviderDisabled(String s) {
                        locationManager.removeUpdates(this);
                    }

                    @Override
                    public void onStatusChanged(String s, int i, Bundle bundle) {
                    }

                    @Override
                    public void onProviderEnabled(String s) {
                    }
                };

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 500L,30f, locationListener);
            } catch (SecurityException e) {
                e.printStackTrace();
            }
}

我已经初始化了它,但它仍然不工作。应用程序没有崩溃,但我没有得到经度和纬度。正如我提到的
getLastKnownLocation()
可能不会返回任何位置,这是因为以前没有获取任何位置,只要
getLastKnownLocation()
没有返回任何位置,您就可以设置一个位置侦听器并获取当前的实时位置,请按照此链接中的说明进行操作:您可以根据该位置进行更改,因为我仍然无法获取它。这将是一个巨大的帮助它可以帮助: