최근 Android 프로젝트를 진행하면서 위치 정보를 얻기 위해 GPS를 사용해야 했습니다. API를 확인한 후 위치 정보를 얻으려면 매우 간단한 문장만 필요하다는 것을 알았습니다.
getLastKnownLocation(LocationManager.GPS_PROVIDER),
그래서 저는 매우 행복했습니다. 그런데 코드를 작성하자마자 반환값(위치 유형)이 항상 null이었는데... 정말 답답했습니다. 오랫동안 인터넷으로 검색해 보니 저처럼 이 문제로 고생하시는 분들이 많더라구요.. GPS가 안켜져서 그런거 같다는 분도 계시고, 관련 권한이 추가되어 있지 않아서 그런거 같다는 분도 계시더라구요. 하지만 내 것은 설정에서 분명히 켜져 있고 권한도 자연스럽습니다. 오랫동안 API를 다루다가 마침내 그 이유를 알아냈습니다. GPS를 켜는 것은 실제로
setTestProviderEnabled("gps",true);
라는 문장에 달려 있으며 이는 설정과는 아무런 관련이 없다는 것이 밝혀졌습니다. 전화(적어도 이것이 내 전화에서 테스트한 것입니다). 전화기의 설정이 꺼져 있어도 이 문장은 켜져 있을 수 있고, 전화기 설정이 켜져 있어도 이 줄이 없으면 쓸모가 없습니다. 이 문장에 해당하는 것은
setTestProviderEnabled("gps",false);
GPS를 껐을 때 사용하는
GPS를 켠 후에 위의 방법으로 위치를 얻을 수 있나요? 아직도 불가능합니다! 정확하게 말하면, 이 함수는 지난번에 얻은 위치 정보를 얻기 때문에 그럴 수도 있습니다. 이 프로그램을 처음 실행하면 이전에 위치 정보를 얻지 못했고 당연히 반환 값이 null이 될 것이라고 상상해 보십시오. . API를 주의 깊게 확인한 후
requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)
에서 다음 문장을 발견했습니다. 가장 최근 위치를 수신하는 데 시간이 걸릴 수 있습니다. 즉각적인 위치가 필요한 경우 애플리케이션은 getLastKnownLocation(String) 메소드를 사용할 수 있습니다. 따라서 위치 정보를 얻기 위해서는 이 메소드를 이용하여 관리자에 대한 리스너를 설정하고 리스너의 onLocationChanged(Location location)에서 이를 얻어야 합니다.
테스트 코드는 다음과 같습니다.
public void onLocationChanged(Location location) { Log.i("onLocationChanged", "come in"); if (location != null) { Log.w("Location","Current altitude = "+ location.getAltitude()); Log.w("Location","Current latitude = "+ location.getLatitude()); } }
테스트 후 일정 시간이 지나면 위치를 얻을 수 있습니다(획득 시간은 minTime 및 minDistance와 관련됨). 주의가 필요한 또 다른 문제는 리스너를 설정한 후 리스너를 삭제하기 전에 위 방법을 사용하여 GPS를 끌 수 없다는 것입니다. 그렇지 않으면 오류가 보고됩니다. 따라서 GPS를 끄는 방법은
manager.removeUpdates (listener);//listener 即为监听器实例 manager.setTestProviderEnabled("gps",false);
테스트 코드는 다음과 같으며, 필수 권한은
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission>
import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; public class audio extends Activity { /** Called when the activity is first created. */ LocationManager locationManager; LocationListener llistener; String provider; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String serviceName = Context.LOCATION_SERVICE; locationManager = (LocationManager) getSystemService(serviceName); locationManager.setTestProviderEnabled("gps", true); provider = locationManager.getBestProvider(criteria, true); Log.d("provider", provider); llistener = new LocationListener() { @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub Log.i("onLocationChanged", "come in"); if (location != null) { Log.w("Location", "Current altitude = " + location.getAltitude()); Log.w("Location", "Current latitude = " + location.getLatitude()); } locationManager.removeUpdates(this); locationManager.setTestProviderEnabled(provider, false); } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub Log.i("onProviderDisabled", "come in"); } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub Log.i("onProviderEnabled", "come in"); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub Log.i("onStatusChanged", "come in"); } }; locationManager.requestLocationUpdates(provider, 1000, (float) 1000.0, llistener); } protected void onDestroy() { locationManager.removeUpdates(llistener); locationManager.setTestProviderEnabled(provider, false); super.onDestroy(); }
더보기 여러 Android에서 GPS 내비게이션을 열고 위치 정보를 얻으면 null이 반환됩니다. 관련 기사는 PHP 중국어 웹사이트를 참고하세요!