问题描述
我是Android的新手,在我当前的项目中,我正在尝试使用GPS检索位置。获取位置的代码位于单独的非活动类中,因为我显示坐标的片段被塞满了。
我尝试使用来自developer.android.com的指南,但没有得到任何权限提示,并且当我按片段中的按钮时,我仅获得了默认的纬度和经度0值。 / p>
我已在清单中提供了权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
GPS定位器类:
public class LocationProvider implements ActivityCompat.OnRequestPermissionsResultCallback {
private static final int PERMISSION_REQUEST_LOCATION = 1;
private Activity activity;
Location gps_loc;
Location final_loc;
double longitude;
double latitude;
private LocationManager locationManager;
public LocationProvider(Activity activity) {
this.activity =activity;
locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_LOCATION) {
// Request for permission.
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getLocation();
} else {
requestLocationPermission();
}
}
}
private void getLocation() {
// Check if the permission has been granted
if (ActivityCompat.checkSelfPermission(activity,Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
gps_loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (gps_loc != null) {
Log.v("Loc_provider",gps_loc.toString());
final_loc = gps_loc;
latitude = final_loc.getLatitude();
longitude = final_loc.getLongitude();
}
} else {
requestLocationPermission();
}
}
private void requestLocationPermission() {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSION_REQUEST_LOCATION);
}
public String getCoordinates() {
return latitude + " "+ longitude;
}
}
片段中的代码:
FloatingActionButton fab=view.findViewById(R.id.floatingActionButton);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
locProvider=new LocationProvider(requireActivity());
gpsCoordinates.setText(locProvider.getCoordinates());
}
});
最欢迎提供修复代码的提示和解决方案。
更新1: 我改为将代码移到片段中,使其如下所示:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!checkIfAlreadyhavePermission()) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
} else {
gps_loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
gpsCoordinates.setText(getCoordinates());
}
}
});
private String getCoordinates() {
if (gps_loc != null) {
Log.v("Loc_provider",gps_loc.toString());
final_loc = gps_loc;
latitude = gps_loc.getLatitude();
longitude = gps_loc.getLongitude();
}
return latitude + " " + longitude;
}
private boolean checkIfAlreadyhavePermission() {
int result = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_FINE_LOCATION);
return result == PackageManager.PERMISSION_GRANTED;
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_LOCATION: {
// If request is cancelled,the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Log.v("Grant_Results",String.valueOf(grantResults[0]));
Toast.makeText(getActivity(),"permission granted",Toast.LENGTH_LONG).show();
gpsCoordinates.setText(getCoordinates());
} else {
Toast.makeText(getActivity(),"permission denied",Toast.LENGTH_LONG).show();
}
break;
}
}
}
我现在得到权限提示,但是位置仍然没有更新(我得到0)。
解决方法
请注意:
-
不建议保存一个Activity对象,这可能会导致内存泄漏。活动可能会被破坏并重新创建(例如,当屏幕方向更改时)。保留对旧活动的引用会给您带来麻烦。
-
实现
ActivityCompat.OnRequestPermissionsResultCallback
接口无济于事。您的方法将永远不会被调用。您将必须在活动中明确调用它。 -
您尚未请求权限,因此将不会显示您的权限提示,并且将返回
double
的默认值0。您需要调用getLocation()
方法,以使控件位于else块上并显示您的权限提示
我建议您处理活动中的权限。让活动获取该位置的坐标。您可以使活动使用方法LocationFetcher
实现一个名为getCoordinates()
的接口。然后,您可以像这样在片段中调用它:
LocationFetcher locationFetcher = (LocationFetcher) activity;
gpsCoordinates.setText(locationFetcher.getCoordinates());
,
通过在Fragment中实现LocationListener然后添加
来解决locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,400,1,this);
在onRequestPermissionsResult()中。