Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 네트워크 프로바이더로 현재 국가 코드 가져오는 방법

이 튜토리얼에서는 안드로이드에서 네트워크 프로바이더(Network Provider)의 위치 정보를 활용해 현재 국가 코드를 가져오는 방법을 단계별로 살펴보겠습니다.

핵심 원리는 간단합니다. LocationManager의 네트워크 프로바이더로부터 마지막으로 확인된 위치(위도·경도)를 얻은 뒤, Geocoder를 사용해 해당 좌표를 주소 정보로 변환하고 그중 국가 코드를 추출하는 것입니다.

1단계 — 새 프로젝트 생성

안드로이드 스튜디오에서 File → New Project를 선택하고, 필요한 모든 세부 정보를 입력하여 새 프로젝트를 생성합니다.

2단계 — 레이아웃 작성 (res/layout/activity_main.xml)

아래 코드를 res/layout/activity_main.xml 파일에 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/text"
        android:textSize="30sp"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

위 코드에서는 현재 국가 코드를 화면에 표시하기 위한 TextView 하나를 배치했습니다.

3단계 — 메인 액티비티 구현 (src/MainActivity.java)

아래 코드를 src/MainActivity.java 파일에 추가합니다.

package com.example.myapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.io.IOException;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    TextView textView;
    Location location;
    double describeContents;
    List<Address> addresses;
    Geocoder geocoder;

    @RequiresApi(api = Build.VERSION_CODES.P)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.text);
        LocationManager locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 101);
        }
        location = locationManager
        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        geocoder = new Geocoder(this);
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 101:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    try {
                        addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 10);
                        Address address = addresses.get(0);
                        textView.setText("" + address.getCountryCode());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    //not granted
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    @Override
    protected void onResume() {
        super.onResume();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        try {
            addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 10);
            Address address = addresses.get(0);
            textView.setText("" + address.getCountryCode());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

코드의 주요 흐름은 다음과 같습니다.

onCreate()에서는 LocationManager 서비스를 가져오고, 위치 권한이 부여되지 않았다면 ACCESS_FINE_LOCATION과 ACCESS_COARSE_LOCATION 권한을 요청합니다. 이후 네트워크 프로바이더(NETWORK_PROVIDER)를 통해 마지막으로 확인된 위치를 가져오고 Geocoder 인스턴스를 초기화합니다.

onResume()onRequestPermissionsResult()에서는 위치 좌표를 getFromLocation() 메서드로 주소 목록으로 변환한 후, 첫 번째 주소의 getCountryCode() 값을 호출하여 국가 코드를 TextView에 표시합니다.

4단계 — 매니페스트 설정 (AndroidManifest.xml)

아래 코드를 AndroidManifest.xml 파일에 추가하여 필요한 권한을 선언합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.myapplication">

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

여기서는 대략적인 위치 접근 권한(ACCESS_COARSE_LOCATION), 인터넷 권한(INTERNET), 그리고 전화 상태 읽기 권한(READ_PHONE_STATE)을 선언했습니다. 특히 INTERNET 권한은 Geocoder가 온라인으로 좌표를 주소로 변환하는 데 반드시 필요합니다.

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. 안드로이드 스튜디오에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 실행 아이콘을 클릭하세요. 실행 옵션에서 자신의 모바일 기기를 선택하면, 기기 화면에 현재 국가 코드가 표시되는 것을 확인할 수 있습니다.

안드로이드에서 네트워크 프로바이더로 현재 국가 코드 가져오는 방법