본문 바로가기

Android/Intent

안드로이드/Android 단말마다 SMS, MMS, CALL 사용 여부 확인 하기~!


 < 개발 환경 > 
   SDK 버전 : 안드로이드 SDK 2.2  
   API LEVEL : 8 
   이클립스 버젼 : Indigo
   테스트단말 : 갤럭시 S2 , 갤럭시 탭 10.1, 갤럭시 탭 8.9, Nexus S, 갤럭시 S2 LTE 등. 




안드로이드/Android 단말마다 SMS, MMS, CALL 사용 여부 확인 하기~!



안드로이드 프로젝트를 개발하면서, 단말 마다 대응 해줘야 하는 경우가 많은데요. 요즘에는 회사마다 안드로이드 프레임웍을 수정해서 사용 하고 있는 경우가 대부분이라, 안드로이드 기본 기능들을 바뀌거나 사용 할 수 없게 되는 경우가 많이 발생 합니다.


예를 들자면, 삼성 갤럭시 탭 10.1 인치 같은 경우는 SMS, MMS, CALL 기능을 사용 할 수 없는 버젼 이기 때문에, 기존에 SMS나 MMS, CALL 기능을 사용 했던 코드들을 그대로 사용 할 경우, 단말이 무한 루프에 빠져 죽는 경우가 발생 하게 됩니다.


그렇기 때문에 SMS, MMS, CALL 기능을 사용 하기 전에 실제 단말에서 이 3가지 기능에 대해 제공 하고 있는지 여부를 판단하는 것이 중요 합니다. 이 기능들을 판단 하기 위해서는 PackageManager 의 queryIntentActivities 를 사용 해야 하는데요.


queryIntentActivities 는 인자로 받은 intent의 action 값을 가지고 실제 사용 할 수 있는 Activity 목록을 반환해주는 메서드 입니다. 그렇기 때문에 먼저 SMS, MMS, CALL 기능의 Activity 가 정의 되 있는 단말에서만 해당 목록을 얻어 올 수 있습니다.



우리가 사용하는 SMS, MMS, CALL 기능은 모두 각각의 Activity들이 제공 하는 기능 입니다.



자 그렇다면, 실제로 코드에서 확인 하는 방법을 알아 보겠습니다.~!!


/**
	 * SMS
	 */
	public static boolean aviliableSMS(Context context) {
		
		PackageManager pac = context.getPackageManager();

		Uri smsUri = Uri.parse("sms:"); 
		Intent smsIntent = new Intent(Intent.ACTION_SENDTO, smsUri);

		List list = pac.queryIntentActivities
				(smsIntent, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);	
		ArrayList tempList = new ArrayList();
		
		int count = list.size();
		String packageName = "";
		
		for(int i = 0; i < count; i++)  
		{
			ResolveInfo firstInfo = list.get(i);
			packageName = firstInfo.activityInfo.applicationInfo.packageName;
			tempList.add(list.get(i).activityInfo);

			Log.d("packageName", "packageName = " + packageName);
		}
		
		if(packageName == null || packageName.equals("")){
			return false;
		}else{
			return true;
		}
	}
	
	
	/**
	 * MMS
	 */
	public static boolean aviliableMMS(Context context) {
		
		PackageManager pac = context.getPackageManager();

		Uri mmsUri = Uri.parse("mmsto:");
		Intent mmsIntent = new Intent(Intent.ACTION_VIEW, mmsUri); 

		List list = pac.queryIntentActivities
				(mmsIntent, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);	
		ArrayList tempList = new ArrayList();
		
		int count = list.size();
		String packageName = "";
		
		for(int i = 0; i < count; i++)  
		{
			ResolveInfo firstInfo = list.get(i);
			packageName = firstInfo.activityInfo.applicationInfo.packageName;
			tempList.add(list.get(i).activityInfo);

			Log.d("packageName", "packageName = " + packageName);
		}
		
		if(packageName == null || packageName.equals("")){
			return false;
		}else{
			return true;
		}
	}
	
	
	/**
	 * CALL
	 */
	public static boolean aviliableCALL(Context context) {
		
		PackageManager pac = context.getPackageManager();

		Uri callUri = Uri.parse("tel:");
        Intent callIntent = new Intent(Intent.ACTION_CALL, callUri);

		List list = pac.queryIntentActivities
				(callIntent, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);	
		ArrayList tempList = new ArrayList();
		
		int count = list.size();
		String packageName = "";
		
		for(int i = 0; i < count; i++)  
		{
			ResolveInfo firstInfo = list.get(i);
			packageName = firstInfo.activityInfo.applicationInfo.packageName;
			tempList.add(list.get(i).activityInfo);

			Log.d("packageName", "packageName = " + packageName);
		}
		
		if(packageName == null || packageName.equals("")){
			return false;
		}else{
			return true;
		}
	}
//



실제 사용 코드에서는 해당 Activity 사용 유무를 판단 하시고, 실제 SMS, MMS, CALL 기능들을 이용 하시면 됩니다.


/**
* SMS 실제 사용 코드 입니다.
*/
if(CommonUtil.aviliableSMS(getApplicationContext())){
		uri = Uri.parse("sms:" + "01000000000");
		intent = new Intent(Intent.ACTION_SENDTO, uri);
		startActivity(intent);
	}else{
		Toast.makeText(getApplicationContext(),
				"SMS 서비스를 이용할 수 없는 단말 입니다.",
				Toast.LENGTH_SHORT).show();
	}

/**
* MMS 실제 사용 코드 입니다.
*/
if(CommonUtil.aviliableMMS(getApplicationContext())){
		Uri uri = Uri.parse("" + attached_uri);   
        Intent it = new Intent(Intent.ACTION_SEND);   
        it.putExtra("sms_body", "some text");   
        it.putExtra(Intent.EXTRA_STREAM, uri);   
        it.setType("image/*");
        // 삼성 단말에서만 허용 ( 앱 선택 박스 없이 호출 )
//      it.setComponent(new ComponentName("com.sec.mms", "com.sec.mms.Mms"));
        startActivity(it); 
	}else{
		Toast.makeText(getApplicationContext(),
				"MMS 서비스를 이용할 수 없는 단말 입니다.",
				Toast.LENGTH_SHORT).show();
	}

/**
* CALL 실제 사용 코드 입니다.
*/
if(CommonUtil.aviliableCALL(getApplicationContext())){
		uri = Uri.parse("tel:" + "01000000000");
		intent = new Intent(Intent.ACTION_CALL, uri);
		startActivity(intent);
	}else{
		Toast.makeText(getApplicationContext(),
				"전화 서비스를 이용할 수 없는 단말 입니다.",
				Toast.LENGTH_SHORT).show();
	}