我的应用程序通过根据记录的大小合并记录,从sqlite数据库和SMS检索记录到其他应用程序,我无法识别哪些消息已经获得了交付报告,哪些消息没有。我在reciveMethods上使用BroadcastReceiver 但不幸的是我无法理解如何识别。我很乐意,如果你们中的任何一个人建议我如何处理这个问题。或任何其他更好的方式
public class MessageMangerActivity extends Activity {
private String MessageBody;
public enum MessageType
{
s,r,c
}
String ReceiverNumber="5556";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.messages);
try {
SubmitReportToServer();
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
private void SubmitReportToServer() throws Exception {
// MessageHandler messageHandler =new MessageHandler();
//get Unsent Message
ReportAdapter reportAdapter= new ReportAdapter(this);
reportAdapter.open();
/* Submit Received Item report*/
Cursor receivingResults;
receivingResults=reportAdapter.FetchUnSentReceivingRecords();
int i=0;
if(receivingResults.getCount()!=-1) {
while(receivingResults.moveToNext() ){
MessageBody=MessageType.r + MessageBody +"|"+ receivingResults.getString(0)+"|" + receivingResults.getString(1)+"|"+receivingResults.getString(2)+"|"+
receivingResults.getString(3)+"|"+receivingResults.getString(4)+"|"+receivingResults.getString(5)+"|"+receivingResults.getString(6)+"|"+
receivingResults.getString(7)+"|" + receivingResults.getString(8)+"|"+ receivingResults.getString(9)+"|"+
receivingResults.getString(10)+"|"+receivingResults.getString(11)+",";
i++;
if (i > 1 ) { break; }
}
sendSMS(ReceiverNumber,MessageBody);
receivingResults.close();
/* Submit Issued Item report*/
Cursor issueResults;
issueResults=reportAdapter.FetchUnSentIssuedRecords();
i=0;
if(issueResults.getCount()!=-1) {
while(issueResults.moveToNext() ){
MessageBody=MessageBody + ","+ issueResults.getExtras();
i++;
if (i > 3 ) { break; }
}
sendSMS(ReceiverNumber,MessageBody);
issueResults.close();
}
}
/*Submit Vaccinated Children Report */
Cursor childrenResults;
childrenResults=reportAdapter.FetchUnSentVaccinatedChildrenRecords();
i=0;
if(childrenResults.getCount()!=-1) {
while(childrenResults.moveToNext() ){
MessageBody=MessageBody + ","+ childrenResults.toString();
i++;
if (i > 3 ) { break; }
}
sendSMS(ReceiverNumber,MessageBody);
childrenResults.close();
}
}
private void sendSMS(String receiverNumber, String messageBody) {
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);
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
//update Status
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(receiverNumber, null, messageBody, sentPI, deliveredPI);
}
}
答案 0 :(得分:4)
您需要将所需的数据放入PendingIntent
,以便在传送完成(或失败)时广播。执行此操作时,您需要确保为每条消息创建唯一的PendingIntent
(您可以通过在Intent
上设置唯一的操作来执行此操作)。这是一个例子。
而不是:
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
这样做:
long messageID = ... // This is the message ID, ie: the row ID in the SQLite database that uniquely identifies this message
Intent deliveredIntent = new Intent(DELIVERED + messageID); // Use unique action string
deliveredIntent.putExtra("messageID", messageID); // Add message ID as extra
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
deliveredIntent, PendingIntent.FLAG_ONE_SHOT);
注册接收器时,请务必使用正确的IntentFilter
:
registerReceiver(new BroadcastReceiver(){
...
}, new IntentFilter(DELIVERED + messageID));
现在,当广播投放Intent
时,您可以像onReceive()
这样从中获取数据:
public void onReceive(Context arg0, Intent arg1) {
long messageID = arg1.getLongExtra("messageID", -1L);
if (messageID != -1L) {
// This is the message ID (row ID) of the message that was delivered
... do your processing here
}