Java
Android
SMS
アプリ開発

電話着信したら、その番号宛にSMSを送る

AndroidManifest.xmlに追記するもの

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />

書いてあるままだけれど、
+ READ_PHONE_STATEは電話に関して
+ SEND_SMSはSMSに関して
の権限。こいつを付与しておく。

Java

電話に関する記述

TelephonyManagerさんとPhoneStateListenerさんが何とかしてくれる。

TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(new PhoneStateListener(){
    @Override
    public void onCallStateChanged(int state, String number) {
        // stateに状態を示す数値が、numberには着信時にかかってきた番号が入る
        switch(state) {
            // 着信時のイベント
            case TelephonyManager.CALL_STATE_RINGING:
                System.out.println(number + " さんから着信だよー");
                break;
            // 通話開始時のイベント
            case TelephonyManager.CALL_STATE_OFFHOOK:
                System.out.println("通話をはじめたよー");
                break;
            // 待機状態への変化時(通話を切った時)のイベント
            case TelephonyManager.CALL_STATE_IDLE:
                System.out.println("電話を切ったよー");
                break;
        }
    }
}, PhoneStateListener.LISTEN_CALL_STATE);

SMSに関する記述

SmsManagerさんが上手い事やってくれる。

sendTextMessageメソッド

テキストベースのSMSを送信する。
ぶっちゃけ、SMSが送れさえすれば良いので細かいところは別の機会に調べるつもり。

引数
  1. String destinationAddress
    • 送信先アドレス
  2. String scAddress
    • デフォルトのSMSCを使用するためのサービスセンターアドレス
    • 正直よく分からんのでnull
  3. String text
    • メッセージ内容
  4. PendingIntent sentIntent
    • nullでない場合に、メッセージが正常に送信、または失敗したときにブロードキャストされる
    • 詳細な制御をしたい場合に規定する様子
  5. PendingIntent deliveryIntent
    • nullでない場合に、メッセージが受信者に配信されたときにブロードキャストされる
    • 正直sentIntentとの違いが分からないので要調査
String number = "09000000000";  // 送信先電話番号

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(
    number,
    null,
    "Hello",
    null,
    null
);

最終的な記述

かけてきた相手に、「Hey!!」とだけの簡単なメッセージを送る。

MainActivity.java
package example.com.sample003;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // ----- 大事なのは↓ここから↓ ----- //
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        telephonyManager.listen(new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String number) {
                // stateに状態を示す数値が、numberには着信時にかかってきた番号が入る
                switch (state) {
                    // 着信時のイベント
                    case TelephonyManager.CALL_STATE_RINGING:
                        SmsManager smsManager = SmsManager.getDefault();
                        smsManager.sendTextMessage(
                                number,
                                null,
                                "Hey!!",
                                null,
                                null
                        );
                        break;
                    // 通話開始時のイベント
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        break;
                    // 待機状態への変化時(通話を切った時)のイベント
                    case TelephonyManager.CALL_STATE_IDLE:
                        break;
                }
            }
        }, PhoneStateListener.LISTEN_CALL_STATE);
        // ----- ↑ここまで↑ ----- //
    }
}

おまけ

サンプル