Как отправлять и получать SMS-сообщения от Android-приложения? - программирование

Как отправлять и получать SMS-сообщения от Android-приложения?

Я хочу добавить функцию отправки sms в мое приложение, а также хочу, чтобы пользователь мог выбирать контакты из списка контактов непосредственно из приложения. Есть ли способ, которым список контактов может быть интегрирован с моим приложением.

Спасибо

4b9b3361

Ответ 1

И вот учебник Пошаговое руководство по отправке SMS из приложения для Android.

http://mobiforge.com/developing/story/sms-messaging-android

Надежда Андроидер и мой ответ завершают ваш ответ!

ОБНОВЛЕНИЕ: Поскольку ссылка выше уже умерла:

Отказ от ответственности: Я не написал оригинальную статью. Я просто копирую его здесь. Автор orignal в соответствии с этой статьей был weimenglee. Я копирую статью здесь, потому что после публикации исходной ссылки несколько лет назад, ссылка теперь мертва.

Как отправить SMS

Чтобы начать работу, сначала запустите Eclipse и создайте новый проект для Android. Назовите проект, как показано на рисунке 1.

Рисунок 1

Android использует политику на основе разрешений, где все разрешения, необходимые для приложения, должны быть указаны в файле AndroidManifest.xml. Таким образом, когда приложение будет установлено, пользователю будет ясно, какие конкретные разрешения доступа требуются приложению. Например, при отправке SMS-сообщений потенциально могут возникнуть дополнительные расходы в конце пользователя, указывая, что разрешения SMS в файле AndroidManifest.xml позволят пользователю решить, разрешать ли приложение устанавливать или нет.

В файле AndroidManifest.xml добавьте два разрешения - SEND_SMS и RECEIVE_SMS:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.learn2develop.SMSMessaging"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SMS"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.SEND_SMS">
    </uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS">
    </uses-permission>
</manifest>

В файле main.xml, расположенном в папке res/layout, добавьте следующий код, чтобы пользователь мог ввести номер телефона, а также сообщение для отправки:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Enter the phone number of recipient"
        />     
    <EditText 
        android:id="@+id/txtPhoneNo"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"        
        />
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"         
        android:text="Message"
        />     
    <EditText 
        android:id="@+id/txtMessage"  
        android:layout_width="fill_parent" 
        android:layout_height="150px"
        android:gravity="top"         
        />          
    <Button 
        android:id="@+id/btnSendSMS"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:text="Send SMS"
        />    
</LinearLayout>

Приведенный выше код создает пользовательский интерфейс, показанный на рисунке 2.

введите описание изображения здесь

Далее, в действии SMS, мы подключаем представление Button так, чтобы, когда пользователь нажимает на него, мы проверим, чтобы номер телефона получателя и сообщение были введены, прежде чем мы отправим сообщение с помощью кнопки sendSMS(), которую мы определим кратко:

package net.learn2develop.SMSMessaging;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SMS extends Activity 
{
    Button btnSendSMS;
    EditText txtPhoneNo;
    EditText txtMessage;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        

        btnSendSMS = (Button) findViewById(R.id.btnSendSMS);
        txtPhoneNo = (EditText) findViewById(R.id.txtPhoneNo);
        txtMessage = (EditText) findViewById(R.id.txtMessage);

        btnSendSMS.setOnClickListener(new View.OnClickListener() 
        {
            public void onClick(View v) 
            {                
                String phoneNo = txtPhoneNo.getText().toString();
                String message = txtMessage.getText().toString();                 
                if (phoneNo.length()>0 && message.length()>0)                
                    sendSMS(phoneNo, message);                
                else
                    Toast.makeText(getBaseContext(), 
                        "Please enter both phone number and message.", 
                        Toast.LENGTH_SHORT).show();
            }
        });        
    }    
}

Функция sendSMS() определяется следующим образом:

public class SMS extends Activity 
{
    //...

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        //...
    }

    //---sends an SMS message to another device---
    private void sendSMS(String phoneNumber, String message)
    {        
        PendingIntent pi = PendingIntent.getActivity(this, 0,
            new Intent(this, SMS.class), 0);                
        SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(phoneNumber, null, message, pi, null);        
    }    
}

Чтобы отправить SMS-сообщение, вы используете класс SmsManager. В отличие от других классов, вы не напрямую создаете экземпляр этого класса; вместо этого вы вызовете статический метод getDefault(), чтобы получить объект SmsManager. Метод sendTextMessage() отправляет SMS-сообщение с помощью PendingIntent.

Объект PendingIntent используется для идентификации цели для вызова в более позднее время. Например, после отправки сообщения вы можете использовать объект PendingIntent для отображения другого действия. В этом случае объект PendingIntent (pi) просто указывает на ту же активность (SMS.java), поэтому при отправке SMS ничего не произойдет.

Если вам нужно отслеживать состояние процесса отправки SMS-сообщений, вы можете фактически использовать два объекта PendingIntent вместе с двумя объектами BroadcastReceiver, например:

//--- отправляет SMS-сообщение на другое устройство --- private void sendSMS (String phoneNumber, String message) {
  String SENT = "SMS_SENT";   String DELIVERED = "SMS_DELIVERED";

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
    new Intent(SENT), 0);

PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
    new Intent(DELIVERED), 0);

//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        switch (getResultCode())
        {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS sent", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(), "Generic failure", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(), "No service", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(), "Null PDU", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off", 
                        Toast.LENGTH_SHORT).show();
                break;
        }
    }
}, new IntentFilter(SENT));

//---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver(){
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        switch (getResultCode())
        {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS delivered", 
                        Toast.LENGTH_SHORT).show();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(getBaseContext(), "SMS not delivered", 
                        Toast.LENGTH_SHORT).show();
                break;                        
        }
    }
}, new IntentFilter(DELIVERED));        

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);        

}

В приведенном выше коде используется объект PendingIntent (sentPI) для отслеживания процесса отправки. Когда отправляется SMS-сообщение, срабатывает первое событие onReceive BroadcastReceiver. Здесь вы проверяете статус процесса отправки. Второй объект PendingIntent (deliverPI) контролирует процесс доставки. Второе событие onReceive BroadcastReceiver будет срабатывать при успешном доставке SMS.

Теперь вы можете протестировать приложение, нажав F11 в Eclipse. Чтобы отправить SMS-сообщение из одного экземпляра эмулятора другому, просто запустите другой экземпляр эмулятора Android, перейдя в папку "Инструменты" SDK и запустив Emulator.exe.

введите описание изображения здесь

На рисунке 3 показано, как вы можете отправить SMS-сообщение от одного эмулятора к другому; просто используйте номер порта целевых эмуляторов (показано в левом верхнем углу окна) в качестве номера телефона. Когда SMS-сообщение отправлено успешно, оно отобразит сообщение "СМС-сообщение". Когда он будет успешно доставлен, он отобразит сообщение "SMS доставлено". Обратите внимание, что для тестирования с использованием эмулятора, когда SMS-сообщение успешно доставлено, сообщение "SMS доставлено" не отображается; это работает только для реальных устройств.

На рисунке 4 показано SMS-сообщение, полученное на эмуляторе получателя. Сообщение сначала появилось на панели уведомлений (вверху экрана). При перетаскивании панели уведомлений отображается полученное сообщение. Чтобы просмотреть все сообщение, щелкните сообщение.

введите описание изображения здесь

Если вы не хотите выполнять все проблемы с отправкой SMS-сообщения самостоятельно, вы можете использовать объект Intent, чтобы помочь вам отправить SMS-сообщение. В следующем коде показано, как вы можете вызвать встроенное SMS-приложение, которое поможет вам отправить SMS-сообщение:

Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("sms_body", "Content of the SMS goes here..."); 
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);

На рисунке 5 показано встроенное приложение SMS, вызываемое для отправки SMS-сообщения.

введите описание изображения здесь

Получение SMS-сообщений

Помимо программной отправки SMS-сообщений, вы также можете перехватывать входящие SMS-сообщения с помощью объекта BroadcastReceiver.

Чтобы узнать, как получать SMS-сообщения из приложения Android, в файле AndroidManifest.xml добавьте элемент, чтобы входящие SMS-сообщения могли быть перехвачены классом SmsReceiver:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.learn2develop.SMSMessaging"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SMS"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>        

        <receiver android:name=".SmsReceiver"> 
            <intent-filter> 
                <action android:name=
                    "android.provider.Telephony.SMS_RECEIVED" /> 
            </intent-filter> 
        </receiver>

    </application>
    <uses-permission android:name="android.permission.SEND_SMS">
    </uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS">
    </uses-permission>
</manifest>

Добавьте новый файл класса в свой проект и назовите его как SmsReceiver.java(см. рисунок 6).

введите описание изображения здесь

В классе SmsReceiver расширьте класс BroadcastReceiver и переопределите метод onReceive():

package net.learn2develop.SMSMessaging;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class SmsReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) 
       {    
    }
}

При получении SMS-сообщений будет вызван метод onCreate(). SMS-сообщение содержится и прикрепляется к объекту Intent (цель - второй параметр в методе onReceive()) через объект Bundle. Сообщения хранятся в массиве Object в формате PDU. Чтобы извлечь каждое сообщение, вы используете статический метод createFromPdu() из класса SmsMessage. Затем SMS-сообщение отображается с помощью класса Toast:

package net.learn2develop.SMSMessaging;

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

public class SmsReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        //---get the SMS message passed in---
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String str = "";            
        if (bundle != null)
        {
            //---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];            
            for (int i=0; i<msgs.length; i++){
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                str += "SMS from " + msgs[i].getOriginatingAddress();                     
                str += " :";
                str += msgs[i].getMessageBody().toString();
                str += "n";        
            }
            //---display the new SMS message---
            Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
        }                         
    }
}

Вот оно! Чтобы протестировать приложение, нажмите F11 в Eclipse. Разверните приложение для каждого эмулятора Android. На рисунке 7 показано, как Eclipse показывает текущие эмуляторы. Все, что вам нужно сделать, это выбрать каждый эмулятор и развернуть приложение на каждом из них.

введите описание изображения здесь

На рисунке 8 показано, что при отправке SMS-сообщения на другой экземпляр эмулятора (номер порта 5556) сообщение принимается целевым эмулятором и отображается через класс Toast.

введите описание изображения здесь

Ответ 3

Попробуйте этот учебник для отправки SMS. Надеюсь, это поможет.

http://www.tutorialspoint.com/android/android_sending_sms.htm

Добавьте в свой файл активности следующий метод, в котором вам нужно реализовать функциональность "отправить SMS".

protected void sendSMSMessage() {

  String phoneNo = txtphoneNo.getText().toString();
  String message = txtMessage.getText().toString();

  try {
     SmsManager smsManager = SmsManager.getDefault();
     smsManager.sendTextMessage(phoneNo, null, message, null, null);
     Toast.makeText(getApplicationContext(), "SMS sent.",
     Toast.LENGTH_LONG).show();
  } catch (Exception e) {
     Toast.makeText(getApplicationContext(),
     "SMS faild, please try again.",
     Toast.LENGTH_LONG).show();
     e.printStackTrace();
  }
}

Вам нужно будет импортировать android.telephony.SmsManager для реализации метода sendSMSMessage.

Добавьте кнопку в макет xml активности и вызовите метод sendSMSMessage при событии нажатия кнопки.

Button.setOnClickListener(new View.OnClickListener() {
  public void onClick(View view) {
    sendSMSMessage();
   }
 });

В вашем Manifest.xml добавьте следующее разрешение.

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