마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

BroadcastReceiver가 실제 기기에서는 작동을 안하는 문제...

0 추천

안녕하세요, 

SMS 처리를 위해 BroadcastReceiver 를 사용하여 android.provider.Telephony.SMS_RECEIVED action을 처리하고 있습니다.

manifest에 receiver 등록도 했고, 권한 설정도 하고, 별도의 receiver 클래스로 만들기도 하였습니다.

문제는, emulator에서는 sms 도착시 제대로 onReceive 가 호출이 됩니다.

그런데, 실 기기에서 테스트해보려고 실 기기에 올려서 해봤는데 sms가 도착해도 onReceive가 호출이 되지 않네요.

사용하는 기기는 갤럭시 s3 (4.3)입니다.

 

사용한 코드는 아래와 같습니다. 


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class SmsR extends BroadcastReceiver {
	private static final String LOG_TAG = "SmsR";
	private static final String ACTION ="android.provider.Telephony.SMS_RECEIVED";        
	 
	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		StringBuilder ab = new StringBuilder();
		Log.i(LOG_TAG,"[SMSapp] onReceiveIntent: Received");
		if (intent.getAction().equals(ACTION)){
			Bundle bundle = intent.getExtras();			
			if (bundle !=null){
				Object[] pdusObj = (Object[]) bundle.get("pdus");
				if (pdusObj == null) { return; }
				
				String txt_call = "";
				String txt_content = "";
				SmsMessage[] messages = new SmsMessage[pdusObj.length];
				for (int i=0;i<pdusObj.length;i++){
					messages[i] = SmsMessage.createFromPdu ((byte[])pdusObj[i]);
					txt_call = messages[i].getDisplayOriginatingAddress();
					txt_content = messages[i].getDisplayMessageBody();
					ab.append("received compressed SMS\n FROM ");
					ab.append(txt_call);					
					ab.append("--Message--");
					ab.append(txt_content);				
				
				}
				
				Intent i= new Intent(context, InputActivity.class);
				i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				//i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
				i.putExtra("txt_call", txt_call);
				i.putExtra("txt_content", txt_content);
				context.startActivity(i);
				
			}
			
			Log.i(LOG_TAG,"[SMSapp] onReceiveIntent: "+ ab);
			Toast.makeText(context,ab.toString(),Toast.LENGTH_LONG).show();

		}		
	}

}

manifest 에 추가된 내용은

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application ~~~>
     <receiver android:name=".SmsR">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
</application>

 

안드로이드 개발은 경험이 짧아 정확하게 무슨 문제가 있는건지 특정하기가 어렵네요. 특히나 emulator에서는 되는 데 실제 기기에서는 안되는 이유가 궁금합니다.

onReceive 이벤트가 발생하는 log 자체가 찍히질 않습니다.

 

답변 기다리고 있겠습니다.

 

감사합니다.

 

 

 

도리탱 (180 포인트) 님이 2014년 4월 2일 질문

1개의 답변

+1 추천
자가 답변 답니다,

handcent sms 앱이 깔려있어서 그렇군요. priority property 를 통해 해결해야할 것으로 여겨집니다.
도리탱 (180 포인트) 님이 2014년 4월 2일 답변
...