오늘은 업무상 예전에 작성했던 GPS 테스트 프로그램을 꺼내서 수정했습니다. 이 프로그램은 역사가 좀 있는 편인데, 안드로이드 개발을 배운 지 얼마 되지 않은 2011년에 썼는데, 실험적인 작품으로 여겨졌죠. 이제 작업에 필요한 부분이라 다시 꺼내서 수리해야겠습니다. 그러다가 안드로이드의 GPS 서비스에 대해 잘 모른다는 것을 알게 되어서 오늘 GPS 서비스에 대한 정보를 좀 읽고 관련 지식 포인트를 기록해 봤습니다.
저는 수년간 GPS 관련 임베디드 소프트웨어를 만들어 왔기 때문에 GPS 측위 모듈을 테스트하는 프로그램을 만들 때 가장 먼저 하는 반응은 직렬 포트를 통해 GPS 모듈의 데이터를 읽는 것입니다. , GPS 형식 데이터의 NMEA를 분석합니다. NMEA는 GPS뿐만 아니라 기타 산업 통신에도 사용되는 표준화된 데이터 형식입니다. 관련 데이터를 분석한 후 표시함으로써 기본적인 GPS 위치 확인 테스트 기능이 완성됩니다.
1. Android 포지셔닝 서비스
먼저 포지셔닝 서비스에 대해 Android에서 제공하는 지원을 살펴보겠습니다.안드로이드 위치 서비스는 모두 위치 아래에 위치해 있으니 여기서는 자세히 분석하지 않겠습니다. 언급해야 할 한 가지
2. LocationManager 포지셔닝
//获取定位服务 LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); //判断是否已经打开GPS模块 if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) { //GPS模块打开,可以定位操作 }3. GpsStatus 리스너
// 通过GPS定位 String LocateType= locationManager.GPS_PROVIDER; Location location = locationManager.getLastKnownLocation(LocateType); // 设置监听器,设置自动更新间隔这里设置1000ms,移动距离:0米。 locationManager.requestLocationUpdates(provider, 1000, 0, locationListener); // 设置状态监听回调函数。statusListener是监听的回调函数。 locationManager.addGpsStatusListener(statusListener); //另外给出 通过network定位设置 String LocateType= locationManager.NETWORK_PROVIDER; Location location = locationManager.getLastKnownLocation(LocateType);포지셔닝 서비스의 초기 설정 단계는 위에 나와 있지만 GPS 위성은 정기적으로 방송된다는 것을 모두 알고 있습니다. 데이터, 즉 위성의 GPS 데이터가 정기적으로 수신됩니다. 우리는 위성으로부터 데이터를 적극적으로 요청할 수 없으며 수동적으로 데이터를 수신할 수만 있습니다. (중국의 Beidou 2호는 위성 메시지를 위성으로 보낼 수 있습니다.) 따라서 위성에서 반환된 데이터를 처리하려면 수신기를 등록해야 합니다.
private final GpsStatus.Listener statusListener = new GpsStatus.Listener() { public void onGpsStatusChanged(int event) { // GPS状态变化时的回调,获取当前状态 GpsStatus status = locationManager.getGpsStatus(null); //自己编写的方法,获取卫星状态相关数据 GetGPSStatus(event, status); } };위는 주로 status.getSatellites()를 통해 상태 값에서 검색된 위성 수를 가져오는 것입니다. 획득한 GpsSatellite 개체는
private void GetGPSStatus(int event, GpsStatus status) { Log.d(TAG, "enter the updateGpsStatus()"); if (status == null) { } else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) { //获取最大的卫星数(这个只是一个预设值) int maxSatellites = status.getMaxSatellites(); Iterator<GpsSatellite> it = status.getSatellites().iterator(); numSatelliteList.clear(); //记录实际的卫星数目 int count = 0; while (it.hasNext() && count <= maxSatellites) { //保存卫星的数据到一个队列,用于刷新界面 GpsSatellite s = it.next(); numSatelliteList.add(s); count++; Log.d(TAG, "updateGpsStatus----count="+count); } mSatelliteNum = numSatelliteList.size(); } else if(event==GpsStatus.GPS_EVENT_STARTED) { //定位启动 } else if(event==GpsStatus.GPS_EVENT_STOPPED) { //定位结束 } }나중에 인터페이스를 새로 고칠 수 있도록 대기열에 저장됩니다. 위의 내용은 GPS 상태 리스너를 얻는 것입니다.
위치 변경을 모니터링하는 위치 지정 리스너도 모니터링해야 합니다. 이는 위치 서비스를 제공하는 애플리케이션에 매우 중요합니다.
5. LocationListener 리스너
private final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 updateToNewLocation(location); Log.d(TAG, "LocationListener onLocationChanged"); } public void onProviderDisabled(String provider) { //Provider被disable时触发此函数,比如GPS被关闭 Log.d(TAG, "LocationListener onProviderDisabled"); } public void onProviderEnabled(String provider) { // Provider被enable时触发此函数,比如GPS被打开 Log.d(TAG, "LocationListener onProviderEnabled"); } public void onStatusChanged(String provider, int status, Bundle extras) { Log.d(TAG, "LocationListener onStatusChanged"); // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数 if (status == LocationProvider.OUT_OF_SERVICE || status == LocationProvider.TEMPORARILY_UNAVAILABLE) { } } };
6. 지리적 위치 정보 획득(위도 및 경도, 위성 수, 고도, 위치 상태)
//location对象是从上面定位服务回调函数的参数获取。 mLatitude = location.getLatitude(); // 经度 mLongitude = location.getLongitude(); // 纬度 mAltitude = location.getAltitude(); //海拔 mSpeed = location.getSpeed(); //速度 mBearing = location.getBearing(); //方向방향각과 고도각을 이용하여 지구상의 위성의 위치를 나타내는 2차원 도형을 그릴 수 있으며, 신호대잡음비는 더 큰 효과. 일반 위성 위치 확인 테스트 소프트웨어는 GPS 모듈의 별 검색 기능을 나타내는 신호 대 잡음비의 상태 다이어그램을 제공합니다.
//temgGpsSatellite就是我们上面保存的搜索到的卫星 //方向角 float azimuth = temgGpsSatellite.getAzimuth(); //高度角 float elevation = temgGpsSatellite.getElevation(); //信噪比 float snr = temgGpsSatellite.getSnr();
8. 2차원 위성 위치 지도 그리기
다음은 방향각과 고도각을 기준으로 2차원 위성지도에서 위치를 계산하는 방법이다. 위 렌더링의 왼쪽에 있는 녹색 점은 위성 위치를 나타낸다.
오른쪽의 신호 대 잡음비 히스토그램은 위성의 신호 수신 능력을 나타냅니다.
신호 대 잡음비 그림은 단위 변환일 뿐이므로 여기서는 코드를 제공하지 않겠습니다.//根据方向角和高度角计算出,卫星显示的位置 Point point = new Point(); int x = mEarthHeartX; //左边地球圆形的圆心位置X坐标 int y = mEarthHeartY; //左边地球圆形的圆心位置Y坐标 int r = mEarthR; x+=(int)((r*elevation*Math.sin(Math.PI*azimuth/180)/90)); y-=(int)((r*elevation*Math.cos(Math.PI*azimuth/180)/90)); point.x = x; point.y = y; //point就是你需要绘画卫星图的起始坐标
9. 요약:
Android는 주로 GpsStatus, LocationManager 및 GpsSatellite를 통해 관련 서비스 및 모니터링을 구현하는 등 매우 편리한 위치 서비스를 제공합니다.
그러나 개인적으로 NMEA 데이터를 직접 읽을 수 있다면 적어도 일부 애플리케이션에서는 더 많은 정보를 얻을 수 있다면 매우 편리할 것이라고 생각합니다.
더 많은 Android GPS 위치 확인 테스트(렌더링 및 예제 포함) 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

JVM은 JNI (JavanativeInterface) 및 Java 표준 라이브러리를 통한 운영 체제 API 차이를 처리합니다. 1. JNI는 Java 코드가 로컬 코드를 호출하고 운영 체제 API와 직접 상호 작용할 수 있습니다. 2. Java Standard Library는 통합 API를 제공하며,이 API는 내부적으로 다른 운영 체제 API에 매핑되어 코드가 플랫폼에서 실행되도록합니다.

modularityDoesNotDirectHeftJava'splatformincendence.java'splatformincendenceIngeasted whejvm, butModularItyInfluencesApplicationStructureAndmanagement, deploymentandDuffictionBecomeMoreferficaliticiboliticalWI

bytecodeinjavaistheintermediaterepresentation attenablesplatformincendence.1) javacodeiscompiledintobytecodestoredin.2) thejvminterpretsorcompilesthisbytecodeintomachinecodeartruntime, theCodeTorUnanynanynovice를 허용합니다

javaachievesplatformincendenceThoughthegroughthejavavirtualMachine (JVM), theexecutesByTecodeonAnyDeviceWitHajvm.1) javacodeiscompiledintobytecode.2) thejvm-mmectretsandexecutesThisteCodeIntomachineCificinStructions, 허용

Javagui 개발의 플랫폼 독립성은 과제에 직면하지만 Swing, Javafx, Unifying Locance, Performance Optimization, 타사 라이브러리 및 크로스 플랫폼 테스트를 사용하여 처리 할 수 있습니다. Javagui Development는 교차 플랫폼 일관성을 제공하는 것을 목표로하는 AWT 및 Swing에 의존하지만 실제 효과는 운영 체제마다 다릅니다. 솔루션은 다음과 같습니다. 1) Swing 및 Javafx 사용 GUI 툴킷으로 사용; 2) UIMANAGER.SETLOOKANDFEEL ()을 통해 외관을 통합합니다. 3) 다른 플랫폼에 맞게 성능을 최적화합니다. 4) apachepivot 또는 SWT와 같은 타사 라이브러리 사용; 5) 일관성을 보장하기 위해 크로스 플랫폼 테스트를 수행하십시오.

javadevelopmentisnotentirelyplatform-IndectionentDuetoSeveralFactors.1) JVMVARIATIONSAFFERFFERFORMANDBEHAVIORACROSSDIFFERENTOS.2) nativelibrariesViajniintrictionPlatform-specificiss.3) filepathsandsystempropertiesdifferbetweenplatectry. 4)

Java 코드는 다른 플랫폼에서 실행할 때 성능 차이가 있습니다. 1) JVM의 구현 및 최적화 전략은 OracleJDK 및 OpenJDK와 같이 다릅니다. 2) 메모리 관리 및 스레드 스케줄링과 같은 운영 체제의 특성도 성능에 영향을 미칩니다. 3) 적절한 JVM을 선택하여 JVM 매개 변수 및 코드 최적화를 조정하여 성능을 향상시킬 수 있습니다.

Java'SplatformIndenceHASLIMITATIONSINTERFORMANTOWORHEAD, 버전 컴포팅 가능성, 도전 과제, 플랫폼-특이 적 식품, 및 JVMINSTALLATION/MAYMENDENT.ThesefacteThe "WriteOnce, Runanywhere"


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!
