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

Android에서 네트워크 공급자(Network Provider)로 로케일 정보 가져오는 방법

개요

이 예제는 Android에서 네트워크 공급자(Network Provider)로부터 로케일(Locale) 정보를 가져오는 방법을 보여줍니다. 네트워크 공급자는 Wi-Fi나 셀룰러 기지국 정보를 기반으로 기기의 마지막 위치를 파악하고, 이 좌표를 Geocoder로 역지오코딩하면 해당 지역의 주소와 함께 로케일 정보를 얻을 수 있습니다.

1단계: 새 프로젝트 생성

Android Studio에서 새 프로젝트를 만듭니다. 메뉴에서 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.getLocale());
               } 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.getLocale());
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

코드 동작 방식

  • getLastKnownLocation(LocationManager.NETWORK_PROVIDER): 네트워크 공급자(Wi-Fi·셀룰러 기지국)가 마지막으로 감지한 위치를 가져옵니다.
  • Geocoder.getFromLocation(): 위도·경도 좌표를 주소 객체(Address) 목록으로 변환하는 역지오코딩을 수행합니다.
  • address.getLocale(): 첫 번째 주소 객체에 담긴 로케일 정보를 반환해 TextView에 표시합니다.
  • 사용자가 권한을 허용하면 onRequestPermissionsResult()에서 결과를 처리하고, onResume() 시점에도 로케일 정보를 갱신하도록 구현했습니다.

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)이 선언되어 있습니다. 특히 Geocoder가 온라인 지오코딩 서비스를 호출하므로 인터넷 권한은 반드시 필요합니다.

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 Android 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Android에서 네트워크 공급자(Network Provider)로 로케일 정보 가져오는 방법 Run 아이콘을 클릭하세요. 기기 목록에서 자신의 모바일 기기를 선택하면, 모바일 화면에 아래와 같이 로케일 정보가 표시됩니다.

Android에서 네트워크 공급자(Network Provider)로 로케일 정보 가져오는 방법