티스토리 뷰



안드로이드/Android 해외 사용자 구분 ( 단말 정보 & GPS 이용 )


안드로이드 프로젝트를 진행하다 보면 해외사용자에 대한 구분을 해줘야 할 때가 있습니다. 보통 SYSTEM 언어나(현재 단말에서 사용되는 언어) 단말의 국가코드를 이용해서 비교를 많이 하게 되는데요. 사용자가 단말 구입은 미국에서하고 현재 일본이나, 한국에 거주하고 있으며, SYSTEM 언어는 중국어를 선택해 사용하는 경우가 생길수 있습니다. 그럴경우 100% 위치를 정확한 위치를 찾아내서 대응할 수 없으므로 확률을 높히는 대응을 할 수 밖에 없습니다.

GPS를 이용한 현재 위치를 조회하는 코드 역시 네트워크에 접속이 되어 있어야 확인가능 하다는 큰 문제가 있습니다. 국가간의 인접한 지역에 있을 경우 또한 구분하기가 매우 까다롭습니다. 결론을 말씀드리자면 해외 사용자에 대한 100% 구분은 어렵고, 여러가지 구분들을 조합해서 확률을 높히는 방법으로 가야 한다는 말입니다.

그럼 해외사용자 구분을 위한 방법에는 어떠한 것들이 있을까요?

package arabiannight.tistory.com.location;

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

import CommonUtil.CommonUtil;
import android.app.Activity;
import android.content.Context;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import arabiannight.tistory.com.R;

public class TestGetPhoneLocationActivity extends Activity {

	private static final String TAG = "TestGetPhoneLocationActivity";
	private LocationManager mLocationManager;
	private Geocoder mGeocoder;
	private List
addresses; private Address address; private String mProvider; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setLayout(); // 통신사 이름 mTexts[COMPANY].setText("통신사 이름 = " + CommonUtil.getOperatorName(this)); // 현재 등록된 망 사업자의 MCC(Mobile Country Code)에 대한 ISO 국가코드 반환 mTexts[COUNTRY_CODE].setText("ISO 국가코드 = " + CommonUtil.getCountrylso(this)); // 현재 SYSTEM에 설정된 언어 조회 mTexts[LANGUGE].setText("SYSTEM 언어 = " + CommonUtil.getLanguage(this)); // 로밍 여부 조회 mTexts[ROAMING].setText("로밍여부 = " + CommonUtil.getRoamingState(this)); // Location 매니저 생성 mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // mProvider = mLocationManager.getBestProvider(new Criteria() , true); mProvider = mLocationManager.getBestProvider(setCriteria() , true); mTexts[PROVIDER].setText("Provider = " + mProvider); // 단말의 마지막 Location을 얻어 온다. Location loc = mLocationManager.getLastKnownLocation(mProvider); mGeocoder = new Geocoder(this, Locale.KOREAN); // 2초마다 0미터 이상 이동시 업데이트 mLocationManager.requestLocationUpdates(mProvider, 2000, 0, mLocationListener); getFromLocation(loc); } /** * Location 콜백 Listener 등록 */ private final LocationListener mLocationListener = new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { // GPS 상태 변화에 따른 행동을 적어주면 된다. } @Override public void onProviderEnabled(String provider) { // GPS 사용 가능으로 바꼈을 때 행동이다. } @Override public void onProviderDisabled(String provider) { // GPS 사용 불가능으로 바꼈을 때 행동을 적어주면 된다. } @Override public void onLocationChanged(Location location) { // 바뀐 위치를 수신하였을 경우 수행되는 부분이다. Toast.makeText(getApplicationContext(), mProvider + " : " + getFromLocation(location), Toast.LENGTH_LONG).show(); } }; /** * 현재 가장 적합한 Provider를 선택 한다. */ private Criteria setCriteria() { Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); return criteria; } /** * 현재 Location 이 포함된 국가 이름을 반환 한다. */ private String getFromLocation(Location location) { if(location == null) { return ""; }else { String country = new String(); try { addresses = mGeocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 5); if (addresses.size() > 0) { address = addresses.get(0); country = address.getCountryName(); mTexts[COUNTRY].setText("Country = " + country); addresses.clear(); addresses = null; address = null; } }catch ( IOException e ) { e.printStackTrace(); } return country; } } /* * Layout */ private TextView[] mTexts; private static final int COMPANY = 0; private static final int COUNTRY_CODE = 1; private static final int LANGUGE = 2; private static final int ROAMING = 3; private static final int PROVIDER = 4; private static final int COUNTRY = 5; private void setLayout(){ mTexts = new TextView[]{ (TextView) findViewById(R.id.tv_company), (TextView) findViewById(R.id.tv_country_code), (TextView) findViewById(R.id.tv_languge), (TextView) findViewById(R.id.tv_roaming), (TextView) findViewById(R.id.tv_provider), (TextView) findViewById(R.id.tv_country), }; } }



위의 코드에서 사용한 구분코드를 해당 상황에 맞게 조합해서 사용하시면 해외사용자 구분에 대해 어느정도 대응 할 수 있을꺼라 생각 합니다. 그럼 상황에 맞는 조합을 활용하여 적절하게 사용해 주시기 바랍니다.


파일첨부 :




스크린샷 :










댓글
댓글쓰기 폼