라이프스타일 앱에서 주소를 자동으로 채우는 방법
사용자가 주소를 빠르고 정확하게 입력할 수 있는 자동 방법이 있다면 편리하지 않을까요? HMS Core Location Kit의 융합된 위치 및 지오코딩 기능을 통해 라이프스타일 앱은 사용자의 현재 위치를 자동으로 지정하거나 지도 위치의 거리 주소를 가져와 주소 상자에 해당 정보를 채울 수 있습니다. 덕분에 사용자는 수동으로 주소를 입력해야 하는 번거로움에서 벗어날 수 있을 뿐만 아니라 사람의 실수도 방지할 수 있습니다. 이 기사에서는 이 기능을 앱에 쉽게 통합하고 샘플 코드를 제공하는 방법을 설명합니다.
데모
개발 절차
개발 준비
1. AppGallery Connect에 로그인하고 내 프로젝트를 클릭합니다. 프로젝트를 찾고 프로젝트 설정 > API 관리로 이동한 다음 Location Kit 스위치를 켭니다. 그런 다음 서명 인증서 지문을 구성해야 하는 앱을 클릭하고 프로젝트 설정 > 일반 정보로 이동합니다. 앱 정보 영역에서 SHA-256 인증서 지문 옆에 있는 추가를 클릭하고 SHA-256 인증서 지문을 입력합니다.
2. 프로젝트 설정 > 일반 정보로 이동합니다. 앱 정보 영역에서 agconnect-services.json을 클릭하여 구성 파일을 다운로드합니다. 그런 다음 구성 파일을 앱의 루트 디렉터리에 복사합니다.
3.프로젝트 수준 build.gradle 파일을 구성합니다.
buildscript {
repositories {
google()
jcenter()
maven { url 'https://developer.huawei.com/repo/' }
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.2'
classpath 'com.huawei.agconnect:agcp:1.6.0.300'
}
}
allprojects {
repositories {
maven { url 'https://developer.huawei.com/repo/' }
google()
jcenter()
mavenCentral()
}
}
앱 수준 build.gradle 파일을 구성합니다.
plugins {
id 'com.android.application'
id 'com.huawei.agconnect'
}
앱 수준 build.gradle 파일의 종속성 블록에 다음 빌드 종속성을 추가합니다.
implementation 'com.huawei.hms:location:6.3.0.300'
권한 확인
1. AndroidManifest.xml 파일에서 ACCESS_COARSE_LOCATION(대략 위치 권한), ACCESS_FINE_LOCATION(정확한 위치 권한), ACCESS_BACKGROUND_LOCATION 권한을 선언합니다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
2.관련 위치 권한을 동적으로 적용합니다(안드로이드 6.0 이상에서 위험한 권한 요구 사항에 따름).
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
Log.i(TAG, "android sdk < 28 Q");
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
String[] strings =
{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
ActivityCompat.requestPermissions(this, strings, 1);
}
} else {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
"android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {
String[] strings = {Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
"android.permission.ACCESS_BACKGROUND_LOCATION"};
ActivityCompat.requestPermissions(this, strings, 2);
}
}
위치 결과 얻기
1. 위치 업데이트 간격 및 위치 유형을 포함한 위치 매개변수 설정
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
mSettingsClient = LocationServices.getSettingsClient(this);
mLocationRequest = new LocationRequest();
// Set the location update interval, in milliseconds.
mLocationRequest.setInterval(5000);
// Set the priority.
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
2. getSettingsClient() 메서드를 호출하여 SettingsClient 인스턴스를 가져오고 checkLocationSettings()를 호출하여 장치 위치 설정을 확인합니다.
LocationSettingsRequest locationSettingsRequest = builder.build();
// Before requesting location updates, call checkLocationSettings to check the device location settings.
Task<LocationSettingsResponse> locationSettingsResponseTask =
mSettingsClient.checkLocationSettings(locationSettingsRequest);
기기 위치 기능이 활성화되어 있는지 확인한 후 requestLocationUpdates()를 호출하여 위치 업데이트를 요청합니다.
locationSettingsResponseTask.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "check location settings success");
mFusedLocationProviderClient
.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.i(TAG, "requestLocationUpdatesWithCallback onSuccess");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "requestLocationUpdatesWithCallback onFailure:" + e.getMessage());
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.e(TAG, "checkLocationSetting onFailure:" + e.getMessage());
int statusCode = 0;
if (e instanceof ApiException) {
statusCode = ((ApiException) e).getStatusCode();
}
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
// When startResolutionForResult is called, a popup will
// appear, asking the user to grant relevant permissions.
if (e instanceof ResolvableApiException) {
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(MainActivity.this, 0);
}
} catch (IntentSender.SendIntentException sie) {
Log.e(TAG, "PendingIntent unable to execute request.");
}
break;
default:
break;
}
}
});
역 지오코딩을 통해 현재 위치의 주소 획득
위치의 경도와 위도를 얻은 후 지오코딩 서비스(GeocoderService)에 전달하여 지오코딩 요청 객체를 얻습니다. 그런 다음 getFromLocation 메서드를 호출하고 요청(GetFromLocationRequest) 매개 변수를 설정하여 위치의 주소를 가져옵니다.
if (null == mLocationCallback) {
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
if (locationResult != null) {
List<Location> locations = locationResult.getLocations();
if (!locations.isEmpty()) {
ExecutorUtil.getInstance().execute(new Runnable() {
@Override
public void run() {
Locale locale = new Locale("zh", "CN");
GeocoderService geocoderService = LocationServices.getGeocoderService(MainActivity.this, locale);
GetFromLocationRequest getFromLocationRequest = new GetFromLocationRequest(locations.get(0).getLatitude(), locations.get(0).getLongitude(), 1);
geocoderService.getFromLocation(getFromLocationRequest)
.addOnSuccessListener(new OnSuccessListener<List<HWLocation>>() {
@Override
public void onSuccess(List<HWLocation> hwLocation) {
printGeocoderResult(hwLocation);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Log.i(TAG, e.getMessage());
}
});
}
});
}
}
}
@Override
public void onLocationAvailability(LocationAvailability locationAvailability) {
if (locationAvailability != null) {
boolean flag = locationAvailability.isLocationAvailable();
Log.i(TAG, "onLocationAvailability isLocationAvailable:" + flag);
}
}
};
}
마지막으로 얻은 주소를 화면에 표시하면 구현이 완료됩니다.
참조
위치 키트 official website
위치 키트 Development Guide
Reddit 개발자 토론에 참여하려면
GitHub 샘플 코드를 다운로드하려면
Stack Overflow 통합 문제를 해결하기 위해
Reference
이 문제에 관하여(라이프스타일 앱에서 주소를 자동으로 채우는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hmscore/how-to-automatically-fill-addresses-in-lifestyle-apps-3ck5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)