Android 시스템 시 뮬 레이 션 위치 사용 방법

본 고 는 안 드 로 이 드 시 뮬 레이 션 위치의 사용 방법 을 공유 하고 안 드 로 이 드 6.0 을 지원 하 며 참고 할 수 있 습 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
1.시스템 설정 의 아 날로 그 위 치 를 엽 니 다.
Android 6.0 이하:[개발 자 옵션->아 날로 그 위치 허용]
允许模拟位置
Android 6.0 이상:[개발 자 옵션->아 날로 그 위치 정보 응용 프로그램 선택]
选择模拟位置信息应用
AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
2.시스템 시 뮬 레이 션 위치 가 열 렸 는 지 판단
Android 6.0 이하:Settings.Secure.ALOW 사용MOCK_위치 판단.
//Android 6.0 이하:[아 날로 그 위치 허용]오픈 여부
boolean canMockPosition = Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0
Android 6.0 이상:[아 날로 그 위치 허용]옵션 이 없 으 며 Settings.Secure.ALLOW 를 버 렸 습 니 다.MOCK_LOCATION,위의 방법 으로 판단 할 수 없습니다.[아 날로 그 위치 정보 응용 선택]방법 을 추 가 했 고 아 날로 그 위 치 를 사용 하 는 응용 을 선택해 야 합 니 다.그러나 현재 선택 한 애플 리 케 이 션 을 어떻게 가 져 올 지 모 르 기 때문에 addTestProvider 방법 을 성공 적 으로 실행 할 수 있 는 지 판단 합 니 다.현재 애플 리 케 이 션 을 선택 하지 않 으 면 addTestProvider 는 이상 을 던 집 니 다.

boolean hasAddTestProvider = false;
boolean canMockPosition = (Settings.Secure.getInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0)
    || Build.VERSION.SDK_INT > 22;
if (canMockPosition && hasAddTestProvider == false) {
  try {
    String providerStr = LocationManager.GPS_PROVIDER;
    LocationProvider provider = locationManager.getProvider(providerStr);
    if (provider != null) {
      locationManager.addTestProvider(
          provider.getName()
          , provider.requiresNetwork()
          , provider.requiresSatellite()
          , provider.requiresCell()
          , provider.hasMonetaryCost()
          , provider.supportsAltitude()
          , provider.supportsSpeed()
          , provider.supportsBearing()
          , provider.getPowerRequirement()
          , provider.getAccuracy());
    } else {
      locationManager.addTestProvider(
          providerStr
          , true, true, false, false, true, true, true
          , Criteria.POWER_HIGH, Criteria.ACCURACY_FINE);
    }
    locationManager.setTestProviderEnabled(providerStr, true);
    locationManager.setTestProviderStatus(providerStr, LocationProvider.AVAILABLE, null, System.currentTimeMillis());

    //       
    hasAddTestProvider = true;
    canMockPosition = true;
  } catch (SecurityException e) {
    canMockPosition = false;
  }
}

3.아 날로 그 위치

private class RunnableMockLocation implements Runnable {

  @Override
  public void run() {
    while (true) {
      try {
        Thread.sleep(INTERVEL);

        if (hasAddTestProvider() == false) {
          continue;
        }

        try {
          //     (addTestProvider      )
          String providerStr = LocationManager.GPS_PROVIDER;
          Location mockLocation = new Location(providerStr);
          mockLocation.setLatitude(22);  //   ( )
          mockLocation.setLongitude(113); //   ( )
          mockLocation.setAltitude(30);  //   ( )
          mockLocation.setBearing(180);  //   ( )
          mockLocation.setSpeed(10);  //  ( / )
          mockLocation.setAccuracy(0.1f);  //   ( )
          mockLocation.setTime(new Date().getTime());  //      
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
          }
          locationManager.setTestProviderLocation(providerStr, mockLocation);
        } catch (Exception e) {
          //                          
          stopMockLocation();
        }
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

4.아 날로 그 위치 정지

/**
 *       ,                   
 *         , removeTestProvider      ;
 *   addTestProvider ,      , removeTestProvider     GPS     ;
 */
public void stopMockLocation() {
  if (hasAddTestProvider) {
    try {
      locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
    } catch (Exception ex) {
      //     addTestProvider,                 
    }
    hasAddTestProvider = false;
  }
}

Android Studio Project
系统原生位置
模拟位置
이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기