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

킷캣(KitKat)에서 새 문자 받기

0 추천

http://www.masterqna.com/android/27479/%ED%82%B7%EC%BA%A3%EC%97%90%EC%84%9C-%ED%8A%B9%EC%A0%95%EB%B2%88%ED%98%B8%EB%A1%9C-sms-%EC%88%98%EC%8B%A0%EC%8B%9C-%EC%B2%B4%ED%81%AC%ED%95%98%EA%B2%8C%EB%81%94-%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%80%EB%8D%B0-%EC%95%88%EB%90%98%EB%84%A4%EC%9A%94

 

안녕하세요^-^

개인적으로 특정번호의 문자가 오면 정해진 번호로 문자가 가도록 서비스를 만들어 사용했습니다.

이번에 폰을 KitKat 버전으로 바꾸면서 서비스가 실행이 안되어 확인해보니 API가 바뀌었더라구요.

그래서 검색해서 마침 위에 링크를 보고 따라했는데 안 되어 이렇게 질문드립니다.

혹시 제가 어느 부분이 잘못 됐는지 좀 알려주실 수 있나요? (_ _) 부탁드리겠습니다. 꾸벅.

 

package kr.Neosarchizo.DeliverySMS;

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

public class SMSReceiver extends BroadcastReceiver {
	static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.d("neosarchizo","onReceive!!");
		if (intent.getAction().equals(ACTION)) {
			Log.d("neosarchizo","ACTION!!");
			Bundle bundle = intent.getExtras();
			if (bundle == null) {
				return;
			}
			Log.d("neosarchizo","Bundle!!");
			Object[] pdusObj = (Object[]) bundle.get("pdus");
			if (pdusObj == null) {
				return;
			}
			Log.d("neosarchizo","pdus!!");
			SmsMessage[] smsMessages = new SmsMessage[pdusObj.length];
			for (int i = 0; i < pdusObj.length; i++) {
				smsMessages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
				
				String phoneNumber = smsMessages[i].getOriginatingAddress();
				String message  = smsMessages[i].getMessageBody();
				
				Log.d("neosarchizo","phoneNumber : "+phoneNumber);
				
				if(phoneNumber.equals("########")){
					try {
						SmsManager smsManager = SmsManager.getDefault();
						smsManager.sendTextMessage("#########", null, message, null, null);
						Toast.makeText(context, context.getResources().getString(R.string.deliver_complete), Toast.LENGTH_LONG).show();
					} catch (Exception e) {
						e.printStackTrace();
						Toast.makeText(context, context.getResources().getString(R.string.deliver_failed), Toast.LENGTH_LONG).show();
					}	
				}
			}
		}
	}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kr.Neosarchizo.DeliverySMS"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-sdk android:targetSdkVersion="19" android:minSdkVersion="19"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <receiver android:name=".SMSReceiver" android:permission="android.permission.BROADCAST_SMS">
            <intent-filter android:priority="2147483647">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

 

ecec2000 (240 포인트) 님이 2014년 7월 25일 질문

2개의 답변

0 추천
public class SMSReceiver extends BroadcastReceiver
{
   @Override
   public void onReceive(Context $context, Intent $intent)
   {
      Bundle bundle = $intent.getExtras();
    
      if (bundle == null)
        return;
      
      Object[] pdus = (Object[]) bundle.get("pdus");
      if (pdus == null)
        return;
      
      ArrayList<String> msgs = new ArrayList<String>();
      String number = "";
      for (int i = 0; i < pdus.length; i++)
      {
        SmsMessage smsMsg = SmsMessage.createFromPdu((byte[]) pdus[i]);
        number = smsMsg.getDisplayOriginatingAddress();
        
        msgs.add(smsMsg.getDisplayMessageBody());
      }
      
      if (!TextUtils.isEmpty(number) && number.contains(";"))
        number = number.split(";")[0];
      
      if (!TextUtils.isEmpty(number))
        number = number.trim().replaceAll("[^0-9]", "");
      
      String msg = TextUtils.join(" ", msgs);
      Log.i("SMSReceiver.java | onReceive", "|" + number + "|" + msg);
   }
}

 

저는 이렇게 쓰고 있습니다. 

쎄미 (162,410 포인트) 님이 2014년 7월 25일 답변
킷캣에서 구동이 되시나요?...onReceive()로 아예 진입이 안되는것 같더라구요..
저도 쎄미님 코드로 수정하기 전에 이미 onReceive()로 진입이 안되네요;;
후후 앱은 문자를 또 인식해요;;
왜 그럴까요-_-;;;
0 추천

자답입니다.

 

http://developer.android.com/about/versions/android-3.1.html#launchcontrols

 

안드로이드 보안 정책에 의해 SMS API를 사용하는 경우 꼭 액티비티가 포함되어야 하네요.

즉, 서비스로만 된 앱은 API를 못 쓰도록 막아놓았다고 합니다.

저와 같은 문제 가지신 분들 참고하시기 바랍니다^_^

익명사용자 님이 2014년 7월 26일 답변
...