Before 2022/Android

안드로이드 현재 단말기가 더블 유심일 경우 전화번호를 가져오는 메소드

Eljoe 2018. 12. 10. 17:14
public void setPhoneNumSpinner() {
  // API LEVEL 22 이상에서 가능
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
		// 단말기 정보를 가져오는 클래스
		SubscriptionManager subscriptionManager = SubscriptionManager.from(this);

		// 전화 권한 체크 필수
		if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
			// 현재 삽입된 SIM의 정보를 가져온다.
			Lis<subscriptioninfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList();
			ArrayList<string> Numbers = new ArrayList<>();

			// SIM의 정보 목록에서 가져온 전화번호의 앞자리 한국 코드를 0으로 변경한다.
			for (SubscriptionInfo subInfo : subInfoList) {
				Numbers.add(subInfo.getNumber().replace("+82", "0"));
			}

			// String Array Casting
			String[] arrListToArr = new String[Numbers.size()];
			arrListToArr = Numbers.toArray(arrListToArr);

			// Spinner에 삽입
			ArrayAdapter<String> selectAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, arrListToArr);
			selectAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
			mSpPhoneNum.setAdapter(selectAdapter);

			mSpPhoneNum.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
				@Override
				public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
					// 값 선택 시 로직 처리 부분
				}

				@Override
				public void onNothingSelected(AdapterView<?> parent) {
				}

			});
		}
	}
}

사용자의 휴대폰이 더블 유심(더블 심, 듀얼 심)일 경우(전화번호가 2개) 리스트로 가져와서 spinner에 집어넣는 함수.



2019. 01. 09 수정 사항


통신사마다 유심 전화번호 정책이 다른 듯하다.

더블심이 아닌 경우 아예 Null을 줘서 NPE Crash가 발생하거나 

유심 전화번호 국가코드를 제공하지 않고 010으로 주는 둥...

유심 정책은 표준화 되지않은 걸까? 아쉬울 따름이다.

그래서 모든 예외를 주어서 아래와 같이 리팩토링 하였다.

public void setPhoneNumSpinner(Context context) {
	String[] arrListToArr;

	//더블심은 API LEVEL 22 이상부터 지원
	if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1){
		// 전화 통신 정보를 가져오는 클래스
		SubscriptionManager subscriptionManager = 
				(SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);

		//전화 권한 체크 필수
		if(ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) 
				== PackageManager.PERMISSION_GRANTED && subscriptionManager != null){
			// 현재 삽입된 SIM의 정보를 가져온다.
			List<SubscriptionInfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList();	
			ArrayList<String> numberArr = new ArrayList<>();

			// SIM의 정보 목록에서 가져온 전화번호의 앞자리 한국 코드를 0으로 변경한다.
			for(SubscriptionInfo subInfo : subInfoList){
				String tempPhoneNum = subInfo.getNumber();
				//전화번호가 존재하면
				if (!TextUtils.isEmpty(tempPhoneNum)) {
					// +82(한국 코드)가 없으면
					if (!tempPhoneNum.contains("+82")) {
						// 앞자리가 0인 경우 그대로 삽입
						if ("0".equals(tempPhoneNum.substring(0, 1))) {
							numberArr.add(tempPhoneNum);
							// 없으면 0 추가해서 삽입
						} else {
							numberArr.add("0" + tempPhoneNum);
						}
					} else {
						// +82(한국코드)가 있는 경우 0으로 변경 후 삽입
						numberArr.add(tempPhoneNum.replace("+82", "0"));
					}
				}else{
					//존재하지 않으면 기존 전화번호 삽입
				}
			}

			// String Array Casting
			arrListToArr = new String[numberArr.size()];
			arrListToArr = numberArr.toArray(arrListToArr);

			// Spinner에 삽입
			ArrayAdapter<String> selectAdapter =
				new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, arrListToArr);
			selectAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
			mSpPhoneNum.setAdapter(selectAdapter);
		}
	}else{
		//API LEVEL 22 미만 단말기 처리
	}
}


2020.08.11

코틀린으로 리팩토링

링크