라이프스타일 앱에서 주소를 자동으로 채우는 방법

10648 단어 locationlifestyle
주소 입력은 공동구매, 테이크아웃, 택배, 가사, 물류, 이사 등의 서비스를 제공하는 라이프스타일 앱과 미니 프로그램 이용자들이 자주 해야하는 업무다. 일반적으로 이렇게 하려면 사용자가 주소 정보를 수동으로 입력해야 합니다. 예를 들어 여러 드롭다운 목록 상자를 사용하여 California, Los Angeles 및 Hollywood Blvd를 차례로 선택한 다음 이름과 전화 번호를 수동으로 입력해야 합니다. 이 프로세스는 일반적으로 시간이 걸리며 입력 오류가 발생하기 쉽습니다.

사용자가 주소를 빠르고 정확하게 입력할 수 있는 자동 방법이 있다면 편리하지 않을까요? 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 통합 문제를 해결하기 위해

좋은 웹페이지 즐겨찾기