728x90

android.telephone.SmsManager class를 이용하여, API 코드 2줄로 SMS를 자동으로 보낼 수 있다.


SMS 메시지 보내는 코드

SmsManager smsManager = SmsManager.getDefault(); // Get the default instance of SmsManager

smsManager.sendTextMessage(phoneNumber, null, smsBody, null, null); // Send a text based SMS


MMS 메시지 보내는 코드

SmsManager sms = SmsManager.getDefault();
ArrayList<String> parts = sms.divideMessage(message);
sms.sendMultipartTextMessage(phoneNumber, null, parts, null, null); 


참고 : http://codetheory.in/android-sms/ 에 설명이 잘 나와있다.

private void SendSMS(String phonenumber, String message) {
    SmsManager smsManager = SmsManager.getDefault();
    if(smsManager == null) {
    return;
    }
    String sendTo = phonenumber;
    ArrayList<string> partMessage = smsManager.divideMessage(message);
    if(partMessage.size() > 1){
        Log.d("SMS", "Sending " + partMessage.size() + " parts");
    smsManager.sendMultipartTextMessage(sendTo, null, partMessage, null, null);
    } else {
    smsManager.sendTextMessage(sendTo, null, message, null, null);
    }


phoneNumber 를 다중(여러전화번호)으로 보낼 수 있는지 확인해보니 1건(한 전화번호)씩 보낸다.

SMS를 분할해서 보내는 코드에 대한 예제코드가 위 사이트에 잘 나와 있다.

이 방식을 이용하면 발송건수만큼 문자 보낸갯수가 생성된다.

문자를 보낸 개수를 지우는 방법을 강구해봐야겠다.


25개씩 잘라서 보내는 방법을 찾아보려고 코드를 구현한 건데 전혀 의미가 없는거 같다.

그냥 for문을 처음부터 끝까지 돌리면 될 일인듯.....


import java.util.Arrays;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SendSMS extends Activity {

    Context mContext;
    EditText smsTextContext;
    String[] telNumArr;
    int mobileCnt;
    int selectedCnt;
    int limitCnt;
    int mod;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.send_sms);
       
        mContext = this;
        Intent intent = getIntent(); // 값을 받아온다.
        telNumArr = intent.getStringArrayExtra("mobileNOArr");
       
        smsTextContext = (EditText) findViewById(R.id.smsText);
        selectedCnt = telNumArr.length;
        limitCnt = 25;
        mod = (selectedCnt%limitCnt==0)?selectedCnt/limitCnt:selectedCnt/limitCnt+1;
       
    }   
   
    @SuppressLint("NewApi")
    public void sendSMS(View v){
        String smsText = smsTextContext.getText().toString();
       
        if (smsText.length()>0){
            String sumTelNum = "";
            for(int i=0;i < mod;i++){
                int startIndex = i*limitCnt;
                int endIndex = startIndex + limitCnt <= telNumArr.length ? startIndex + limitCnt : telNumArr.length;
                String[] subArray = Arrays.copyOfRange(telNumArr, startIndex, endIndex);
               System.out.println(i + "번째 서브배열"); 
                for (String telNum : subArray) {
                    System.out.println("telNum" + telNum);

                    telNum = telNum.replaceAll("[^0-9]", ""); // 숫자를 제외한 모든 문자 제거

                    if(telNum.length() == 0) continue;       
                    if(telNum.matches("(01[016789]{1})(\\d{3,4})(\\d{4})")){
                        telNum = telNum.replaceAll("(\\d{3})(\\d{3,4})(\\d{4})", "$1-$2-$3");
                    }
                    sumTelNum += telNum + ";";
                }
                   
                sendSMS(sumTelNum, smsText);               
               
                System.out.println("sumTelNum....." + sumTelNum);
                subArray = null;
                sumTelNum = "";
            }
        } else {
            Toast.makeText(this, "모두 입력해 주세요", Toast.LENGTH_SHORT).show();
        }
    }
   
    public void sendSMS(String smsNumber, String smsText){
        PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT_ACTION"), 0);
        PendingIntent deliveredIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_DELIVERED_ACTION"), 0);
       
        // SMS가 발송될때 실행
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                switch(getResultCode()){
                    case Activity.RESULT_OK:
                        // 전송 성공
                        Toast.makeText(mContext, "전송 완료", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        // 전송 실패
                        Toast.makeText(mContext, "전송 실패", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        // 서비스 지역 아님
                        Toast.makeText(mContext, "서비스 지역이 아닙니다", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        // 무선 꺼짐
                        Toast.makeText(mContext, "휴대폰이 꺼져있습니다", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        // PDU 실패
                        Toast.makeText(mContext, "PDU Null", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter("SMS_SENT_ACTION"));
       
        // SMS가 도착했을때 실행
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode()){
                    case Activity.RESULT_OK:
                        // 도착 완료
                        Toast.makeText(mContext, "SMS 도착 완료", Toast.LENGTH_SHORT).show();
                        //finish();
                        break;
                    case Activity.RESULT_CANCELED:
                        // 도착 안됨
                        Toast.makeText(mContext, "SMS 도착 실패", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        }, new IntentFilter("SMS_DELIVERED_ACTION"));
       
        SmsManager mSmsManager = SmsManager.getDefault();
        mSmsManager.sendTextMessage(smsNumber, null, smsText, sentIntent, deliveredIntent);
    }
}


----------------------------------------------------------------------

MMS 발송코드를  http://stackoverflow.com/questions/6580675/how-to-send-the-sms-more-than-160-character 에서 찾았는데 아직 테스트는 못해봤다. 테스트를 하면 글 내용을 다시 수정하련다.


SmsManager sm = SmsManager.getDefault();
ArrayList<String> parts =sm.divideMessage(LONG_TEXT);
int numParts = parts.size();

ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>();
ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>();

for (int i = 0; i < numParts; i++) {
sentIntents.add(PendingIntent.getBroadcast(getContext(), 0, mSendIntent, 0));
deliveryIntents.add(PendingIntent.getBroadcast(getContext(), 0, mDeliveryIntent, 0));
}

sm.sendMultiPartTextMessage(mDestAddr,null, parts, sentIntents, deliveryIntents)

블로그 이미지

Link2Me

,
728x90

Android 어플을 실행하면 문자를 보낼 화면을 제공해준 방법이다.


이런 방식으로 SMS를 발송하는 것은 ...

전화번호를 여러개 등록하는 것은 통신사에게 제공하는 한도만큼 가능하다.

화면이 보이는 상태에서 보낼 메시지를 적어서 보내기 때문에 많은 사용자에게 문자를 발송하는 것은 어렵다.


Uri smsUri = Uri.parse("tel:" + sumTelNum);
Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
// 보내는 화면이 팝업됨

intent.putExtra("address", sumTelNum); // 받는 번호
intent.putExtra("sms_body", smsText); // 보낼 문자내용
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);


Intent intent = new Intent( Intent.ACTION_SENDTO );
intent.putExtra("sms_body", smsText);
intent.setData( Uri.parse( "smsto:"+sumTelNum ) );
startActivity(intent);


둘다 같은 화면이 나온다.


참고 : http://gogorchg.tistory.com/entry/Android%ED%8E%8C%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Intent-%EC%82%AC%EC%9A%A9%EB%B2%95

에 여러가지 설명이 잘 나와있다.

블로그 이미지

Link2Me

,
728x90

Intent에서 putExtra를 해주게 되면 값을 넘겨 주고 getIntent를 이용해서 값을 받아 사용할 수 있다


Intent intent = new Intent(this, ClassB);
String[] telNumArr = new String[] {"test", "test2"};
intent.putExtra("strings", telNumArr);
startActivity(intent);


public void onCreate() {
  Intent intent = getIntent();
  String[] telNumArr = intent.getStringArrayExtra("strings");
}


Intent intent = new Intent(context,SendSMS.class);
intent.putExtra("mobileNoArr", telNumArr);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 스택에 기존에 사용하던 Activity가 있다면 그 위의 스택을 전부 제거해 주고 호출
context.startActivity(intent);


배열의 길이는 telNumArr.length

System.out.println(telNumArr.length);


배열에서 일정한 개수로 분할해서 처리해야 할 경우에 사용하는 함수

copyOfRange
int[] subArray = Arrays.copyOfRange(array, startIndex, endIndex);
int[] array = new int[]{1, 2, 3, 4, 5};
int[] subArray = Arrays.copyOfRange(array, 1, 3);

결과 : subArray = [2, 3]


1. 가져올 배열의 개수를 구한다.
   Array.length;


2. 배열 개수를 25개로 나누어 몫을 구한다.

   int limitCnt= 25;

   Array.length /limitCnt ;
   3항 연산자 : 몫의 개수 =
(Array.lenght % limitCnt == 0) ? Array.lenght / limitCnt : Array.lenght / limitCnt + 1;


3. 몫의 개수만큼 foreach 문을 돌린다.
   - String[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);
   for(i=0;i<몫의개수;i++){
    startIndex = i*
limitCnt ;
    int endIndex = startIndex + limitCnt <= telNumArr.length ? startIndex + limitCnt : telNumArr.length;

    String[] subArray = Arrays.copyOfRange(Array, startIndex, endIndex);

    System.out.println(subArray);
   }



기타 addFlags

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);



블로그 이미지

Link2Me

,
728x90

C#에서 사용하는 foreach 문과 동일한 형태의 Java for 문을 적어둔다.


C#

 public List<Address_Item> SelectCreature(String Name)
{
    List<
Address_Item> foundCreature = new List<Address_Item>();

    //For the customer name that equals what has been searched...
    foreach (
Address_Item c in m_creature)
    {
        if (c.CreatureName.Equals(Name, StringComparison.OrdinalIgnoreCase))
            foundCreature.Add(c);
    }

    return foundCreature;
}

 foreach 루프를 사용하면 IEnumerable 인터페이스를 지원하는 배열 같은 컨테이너 클래스의 각 항목을 반복할 수 있다.

 Java

 public List<Address_Item> SelectCreature(String Name)
{
    // List is an interface, you must use a specific implementation
    // like ArrayList:
    List<
Address_Item> foundCreature = new ArrayList<Address_Item>();

    //For the customer name that equals what has been searched...
    for ( Address_Item c : m_creature)
    {
        if (c.CreatureName.equalsIgnoreCase(Name))
            foundCreature.add(c);
    }

    return foundCreature;
}


C# 에서는 foreach 문으로 표기를 하는데 Java 에서는 for 문으로 표기하고 괄호안의 내용만 foreach 문 형태로 되어 있다.


String array[] = { "윤아", "수영", "윤시윤", "전소민", "정소민" };

for(int i=0; i<array.size(); i++){   // 조건식에 array.size()를 사용하면 for문을 돌 때마다 size 를 호출한다.
    System.out.println(array.get(i));
}

for(int i=0,size = array.size(); i<size; i++){  // for문을 돌 때마다 size를 호출하는 걸 방지목적
    System.out.println(array.get(i));
}

foreach 문
// 배열의 일부가 아닌, 배열의 전체를 참조할 필요가 있을 경우에 유용하게 사용
// 배열의 값을 수정할 수는 없다.
// JDK 5.0 버전부터는 향상된 for문을 지원한다.
// for(변수타입 변수이름 : 배열이름)
for(String s : array){
    System.out.println(s);
}

'안드로이드 > Java 문법' 카테고리의 다른 글

[Java] 정보은닉과 캡슐화  (0) 2017.10.16
자바 기본 데이터형과 크기  (0) 2017.10.11
Java 클래스(Class) ★★★★★  (0) 2017.05.04
ArrayList and HashMap  (0) 2017.03.06
자바 배열과 기본 문법  (0) 2016.07.11
블로그 이미지

Link2Me

,
728x90

스마트폰에서 동보문자를 발송할 수 있는 한도에 대한 것이 궁금해서 삼성전자서비스 사이트에서 가져와서 적어둔다.


http://www.samsungsvc.co.kr/online/diagnosisgoVw.do?domainId=NODE0000033866&node_Id=NODE0000143559&kb_Id=KNOW0000020397


한 내용의 메시지를 여러 명에게 한 번에 전송할 수 있다.


모델 SKT KT LG U+
갤럭시노트2 기준
(SHV-E250S/K/L)
25개 25개 30개
갤럭시S5 LTE-A
(SM-G906S/K/L)
100개 25개 30개
갤럭시노트4
(SM-N910S/K/L)
100개 25개 30개
갤럭시S6
(SM-G920S/K/L)
100개 25개 30개
갤럭시S6 엣지
SM-G925S/K/L)
100개 25개 30개
갤럭시S6 엣지 플러스
SM-G928S/K/L)
100개 25개 30개
갤럭시노트5
SM-N920S/K/L)
100개 25개 30개
갤럭시S7 엣지
SM-G935S/K/L)
100개 25개 30개
갤럭시S7
SM-G930S/K/L)
100개 25개 30개
갤럭시A7(2016)
SM-A710S/K/L)
100개 25개 30개
갤럭시A5(2016)
SM-A510S/K/L)
100개 25개 30개
갤럭시A8
SM-A800S)
100개 - -
갤럭시J7
SM-J700K)
- 25개 -

메시지를 한 번에 여러 명에게 보내는 기능(동보 전송)에 대한 인원 수 제한은 제조사에서 하는 것이 아니라 통신사 요구사항으로 결정되는 부분이다.

블로그 이미지

Link2Me

,