gpt4 book ai didi

android - 获取纬度和经度?

转载 作者:太空狗 更新时间:2023-10-29 13:03:00 25 4
gpt4 key购买 nike

我正在尝试在我的 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 );


}
}
}

我设置了位置所需的所有权限。

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"/>

因此,每当我点击按钮时,应用程序崩溃都会给我这个错误。而且我也手动检查了是否给了权限。

最佳答案

您还没有初始化您的位置管理器实例。如下更改适配器构造函数:

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);
}

请注意,使用 getLastKnownLocation() 可能会返回旧的和过时的位置,如 android 文档中所述:

Returns a Location indicating the data from the last known location fix obtained from the given provider.

This can be done without starting the provider. Note that this location could be out-of-date, for example, if the device was turned off and moved to another location.

If the provider is currently disabled, null is returned.

在以下链接中对获取位置的多种方式进行了很好的解释: https://developer.android.com/guide/topics/location/strategies

更新

我在下面添加了 locationListener 逻辑,但最佳做法是将位置获取代码放在 Activity 或 fragment 中,请记住,在 Activity 或 fragment 关闭时应删除 locationListener。使用 locationManager.removeUpdates(locationListener) 移除 locationListener。

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 );
} else {
boolean isNetworkAvailable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if(isNetworkAvailable) fetchCurrentLocation()
else //Redirect user to device settings in order to turn on location service
}
}
}

您应该按如下方式实现 locationListener:

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();
}
}

关于android - 获取纬度和经度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52916427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com