>  기사  >  Java  >  Android는 GPS 내비게이션을 열고 위치 정보를 획득하고 null 솔루션을 반환합니다.

Android는 GPS 내비게이션을 열고 위치 정보를 획득하고 null 솔루션을 반환합니다.

高洛峰
高洛峰원래의
2017-01-07 14:47:211903검색

최근 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 중국어 웹사이트를 참고하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.