Android SMS消息传递报告意图

时间:2010-10-06 17:40:21

标签: android android-intent sms

Android在发送短信时未触发传递意图。我在HTC EVO 4G的Android 2.2上测试了这个。

这是当前的代码。我看到“短信已发送意图”。在日志中,但不是“短信发送意图收到。”。

// Constants
String SENT_ACTION = "SMS_SENT_ACTION";
String DELIVERED_ACTION = "SMS_DELIVERED_ACTION";
String CELL_NUMBER = "0000000000";
String MESSAGE = "Hello World!";

// SMS sent pending intent
PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0,
        new Intent(SENT_ACTION), 0);

// SMS delivered pending intent
PendingIntent deliveredIntent = PendingIntent.getBroadcast(this, 0,
        new Intent(DELIVERED_ACTION), 0);

// SMS sent receiver
registerReceiver(new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "SMS sent intent received.");
    }
}, new IntentFilter(SENT_ACTION));

// SMS delivered receiver
registerReceiver(new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "SMS delivered intent received.");
    }
}, new IntentFilter(DELIVERED_ACTION));

// Send the SMS message
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(CELL_NUMBER, null, MESSAGE, sentIntent, deliveredIntent);

2 个答案:

答案 0 :(得分:7)

将此方法称为要发送短信的位置

private String SimState = "";
private String address = ""; // Recipient Phone Number
private String message = ""; // Message Body

private void sendSms() {
    if (isSimExists()) {
        try {
            String SENT = "SMS_SENT";

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

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

            SmsManager smsMgr = SmsManager.getDefault();
            smsMgr.sendTextMessage(address, null, message, sentPI, null);
        } catch (Exception e) {
            Toast.makeText(this, e.getMessage() + "!\n" + "Failed to send SMS", Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
    } else {
        Toast.makeText(this, SimState + " " + "Cannot send SMS", Toast.LENGTH_LONG).show();
    }
}


// For receiving sms

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

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction() != null && ACTION.compareToIgnoreCase(intent.getAction()) == 0) {
            // Sms Received Your code here
        }
    }
}

注意:您必须指定android.permission.SEND_SMS和         清单文件中的android.permission.RECEIVE_SMS权限            也是接收者

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

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tekeli.order"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="11" />
    <uses-permission android:name="android.permission.SEND_SMS" ></uses-permission>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".ActivityOrderActivity"
            android:label="@string/app_name">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".B" ></activity>
         <activity android:name=".C"></activity>
    </application>

</manifest>

答案 1 :(得分:0)

这是一个很晚的答案。但是,这可能会对某人有所帮助。

所讨论的代码可以正常工作,但是,仅需更改即可更改交付请求代码。两者不得使用相同的请求代码。

这里是...并在真实设备上运行以查看投放报告。

EditText edNumber = findViewById(R.id.edNumber);
EditText edMessage = findViewById(R.id.edMessage);

String number = edNumber.getText().toString().trim();
String message = edMessage.getText().toString().trim();

// set pendingIntent for sent & delivered

        PendingIntent sentIntent = PendingIntent.getBroadcast(this, 100, new 
Intent(SENT_ACTION), 0);

        PendingIntent deliveryIntent = PendingIntent.getBroadcast(this, 200, new 
Intent(DELIVERY_ACTION), 0);

        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("SMS ", "sent");
            }
        }, new IntentFilter(SENT_ACTION));

        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("SMS ", "delivered");
            }
        }, new IntentFilter(DELIVERY_ACTION));

        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(number, null, message, sentIntent, 
deliveryIntent);