Android отправляет смс - PullRequest
0 голосов
/ 20 мая 2011

В моем приложении есть список, содержащий телефонные контакты. Когда пользователь нажимает на контакт, он может выбрать из меню отправку смс контакту (или по электронной почте, или другими вещами).

Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
                    while(people.moveToNext()) {
                      int nameFieldColumnIndex = people.getColumnIndex(PhoneLookup.DISPLAY_NAME);
                      String contact = people.getString(nameFieldColumnIndex);
                      int numberFieldColumnIndex = people.getColumnIndex(PhoneLookup.NUMBER);
                      String number = people.getString(numberFieldColumnIndex);
                        if (contact.equals(myArr2_cs[item]))
                            {
                            Intent int_sms = new Intent(Intent.ACTION_SEND);
                            int_sms.setType("text/plain");
                            int_sms.putExtra(Intent.EXTRA_EMAIL  , new String[]{number});
                            int_sms.putExtra(Intent.EXTRA_SUBJECT, "");
                            int_sms.putExtra(Intent.EXTRA_TEXT, "");
                            try {
                               startActivity(Intent.createChooser(int_sms, "Sending SMS.."));
                            } catch (android.content.ActivityNotFoundException ex) {
                               Toast.makeText(MainActivity.this, "No installed sms clients found", Toast.LENGTH_SHORT).show();
                            }

Намеренная часть предназначена для отправки электронной почты - она ​​показывает пользователю список для выбора из клиентов, что я и хочу. Вы видите, что есть две переменные для имени контакта и номера телефона. Пользователь нажимает на название списка, затем нажимает на отправку смс, появляется всплывающий список для выбора из смс, электронной почты, Bluetooth и т. Д. Я выбираю перейти смс или любое другое установленное приложение смс из всплывающего списка, клиент появляется с поля (до, текст) пустые. Я хочу, чтобы номер отображался в поле sms формы sms. Поэтому, если пользователь нажимает «Том Джонс», а затем нажимает «Отправить смс», номер Тома Джонса уже должен быть заполнен в клиенте. Мой код этого не делает.

Я также пытался отправить смс с этими строками, но они привели к принудительному закрытию:

SmsManager sm = SmsManager.getDefault();
String number2 = "6508570720";//this should the number variable
sm.sendTextMessage(number2, null, "Test SMS Message", null, null);

OR

Intent sendIntent= new Intent(Intent.ACTION_VIEW);
sendIntent.putExtra("sms_body", "smsBody");
sendIntent.putExtra("address", number);
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);

Ответы [ 2 ]

0 голосов
/ 28 января 2015

Для завершения вашего ответа, если текст слишком длинный, сообщение не исчезнет. Вы должны соблюдать максимальную длину в зависимости от кодировки. Подробнее см. Здесь. Диспетчер SMS отправляет многократное сообщение, если оно содержит менее 160 символов.

Мой полный SMSMethod, если хотите

// ИСПОЛЬЗОВАТЬ ВСЕГДА

SMSUtils.sendSMS(context, phoneNumber, message);

// Manifest

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

 <receiver
     android:name=".SMSUtils"
     android:enabled="true"
     android:exported="true">
     <intent-filter>
         <action android:name="SMS_SENT"/>
         <action android:name="SMS_DELIVERED"/>
      </intent-filter>
 </receiver>


//JAVA
public class SMSUtils extends BroadcastReceiver {

    public static final String SENT_SMS_ACTION_NAME = "SMS_SENT";
    public static final String DELIVERED_SMS_ACTION_NAME = "SMS_DELIVERED";

    @Override
    public void onReceive(Context context, Intent intent) {
        //Detect l'envoie de sms
        if (intent.getAction().equals(SENT_SMS_ACTION_NAME)) {
            switch (getResultCode()) {
                case Activity.RESULT_OK: // Sms sent
                    Toast.makeText(context, context.getString(R.string.sms_send), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE: // generic failure
                    Toast.makeText(context, context.getString(R.string.sms_not_send), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE: // No service
                    Toast.makeText(context, context.getString(R.string.sms_not_send_no_service), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU: // null pdu
                    Toast.makeText(context, context.getString(R.string.sms_not_send), Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF: //Radio off
                    Toast.makeText(context, context.getString(R.string.sms_not_send_no_radio), Toast.LENGTH_LONG).show();
                    break;
            }
        }
        //detect la reception d'un sms
        else if (intent.getAction().equals(DELIVERED_SMS_ACTION_NAME)) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    Toast.makeText(context, context.getString(R.string.sms_receive), Toast.LENGTH_LONG).show();
                    break;
                case Activity.RESULT_CANCELED:
                    Toast.makeText(context, context.getString(R.string.sms_not_receive), Toast.LENGTH_LONG).show();
                    break;
            }
        }
    }

    /**
     * Test if device can send SMS
     * @param context
     * @return
     */
    public static boolean canSendSMS(Context context) {
        return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
    }

    public static void sendSMS(final Context context, String phoneNumber, String message) {

        if (!canSendSMS(context)) {
            Toast.makeText(context, context.getString(R.string.cannot_send_sms), Toast.LENGTH_LONG).show();
            return;
        }

        PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, new Intent(SENT_SMS_ACTION_NAME), 0);
        PendingIntent deliveredPI = PendingIntent.getBroadcast(context, 0, new Intent(DELIVERED_SMS_ACTION_NAME), 0);

        final SMSUtils smsUtils = new SMSUtils();
        //register for sending and delivery
        context.registerReceiver(smsUtils, new IntentFilter(SMSUtils.SENT_SMS_ACTION_NAME));
        context.registerReceiver(smsUtils, new IntentFilter(DELIVERED_SMS_ACTION_NAME));

        SmsManager sms = SmsManager.getDefault();
        ArrayList<String> parts = sms.divideMessage(message);

        ArrayList<PendingIntent> sendList = new ArrayList<>();
        sendList.add(sentPI);

        ArrayList<PendingIntent> deliverList = new ArrayList<>();
        deliverList.add(deliveredPI);

        sms.sendMultipartTextMessage(phoneNumber, null, parts, sendList, deliverList);

        //we unsubscribed in 10 seconds 
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                context.unregisterReceiver(smsUtils);
            }
        }, 10000);

    }
}
0 голосов
/ 20 мая 2011

Я заметил, что при использовании этого кода случайным образом вылетает мое приложение (не знаю причину наверняка)

sm.sendTextMessage(number2, null, "Test SMS Message", null, null);

Вместо этого, если я делаю это, он никогда не падает:

PendingIntent sent = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
PendingIntent delivered = PendingIntent.getBroadcast(context, 0, new Intent(), 0);
sm.sendTextMessage(number2, null, "Test SMS Message", sent, delivered);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...