在 Android 中创建 SMS 应用程序?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3616386/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 10:59:46  来源:igfitidea点击:

Creating a SMS Application in Android?

androidsms

提问by Sasitharan

I am creating an SMS Application to send and receive SMS.

我正在创建一个短信应用程序来发送和接收短信。

I am able to send SMS using the following code:

我可以使用以下代码发送短信:

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

I would like to receive SMS and put them in my own inbox. How do I create this inbox? I would like it to work the same way as a normal inbox.

我想接收短信并将它们放在我自己的收件箱中。如何创建此收件箱?我希望它以与普通收件箱相同的方式工作。

Bundle bundle = intent.getExtras();     
Object[] pdus = (Object[]) bundle.get("pdus"); 
SmsMessage[] messages = new SmsMessage[pdus.length];    
for (int i = 0; i < messages.length; i++) {

    messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
    Log.v("SMSFun","Body: " + messages[i].getDisplayMessageBody());
    Log.v("SMSFun","Address: " + messages[i].getDisplayOriginatingAddress());   
    //If say we wanted to do something based on who sent it       
    if (messages[i].getDisplayOriginatingAddress().contains("5556")) {

        // we could launch an activity and pass the data   
        Intent newintent = new Intent(ctx, SecretMessage.class);    
        newintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        newintent.putExtra("address", messages[i].getDisplayOriginatingAddress());
        newintent.putExtra("message", messages[i].getDisplayMessageBody());
        ctx.startActivity(newintent);
    }
}

How do I store incoming SMS in the inbox?

如何在收件箱中存储收到的短信?

Is it possible in Android to listen to particular port number for SMS?

是否可以在 Android 中侦听特定端口号以发送短信?

回答by Macarse

I don't think you can place sms in different inboxes and you don't listen to a port to get SMS you use a BroadcastReceiver.

我不认为您可以将短信放在不同的收件箱中,并且您不会通过侦听端口来获取使用BroadcastReceiver.

I would recommend you to go through the open source smspopupapp to get a better idea of how things work for sms in general.

我建议您浏览开源smspopup应用程序,以更好地了解一般情况下 sms 的工作原理。

回答by Rakesh Gondaliya

U can send and recieve message using SMSMAnager class. U can implement custom Reciever that on msg recieved it will notify user that message has arrived.. Here i am attaching code that i have written to send and receive message using Custom Broadcast reciever, It might be useful to u. Note: This is for the version 1.6 above..So make sure that u do it in 2.0 or 2.2 preferably.

您可以使用 SMSMAnager 类发送和接收消息。你可以实现自定义接收器,它会在收到 msg 时通知用户消息已经到达..这里我附上了我编写的使用自定义广播接收器发送和接收消息的代码,它可能对你有用。注意:这是针对上面的 1.6 版本..所以请确保您最好在 2.0 或 2.2 中执行此操作。

Go through it and try to implement it..

通过它并尝试实现它..

public class SMS extends Activity {

公共类短信扩展活动{

 Button btnSendSMS;
 EditText txtPhoneNo;
 EditText txtMessage;
 Button addcontact;
 EditText phonePhoneno;


 private static final int CONTACT_PICKER_RESULT = 1001;
 private static final String DEBUG_TAG = "";

 String phoneNo="";
 String phonenofromcontact="";
 String finallistofnumberstosendmsg ="";


 /** 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);
    addcontact =(Button) findViewById(R.id.addphonenofromcontact);


    addcontact.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View V)
        {
            Intent ContactPickerIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(ContactPickerIntent, CONTACT_PICKER_RESULT);             
        }
    }
    );

    btnSendSMS.setOnClickListener(new View.OnClickListener() 
    {

        public void onClick(View v) 
        {                
            String message = txtMessage.getText().toString();

            phoneNo = txtPhoneNo.getText().toString();
            String phoneNo1=  phonePhoneno.getText().toString(); 

            // Sending message to both the written and added contact...

            finallistofnumberstosendmsg +=phoneNo1 + phoneNo;
            String phoneFinal= phoneNo + finallistofnumberstosendmsg;

            //StringTokenizer st=new StringTokenizer(finallistofnumberstosendmsg,",");

            StringTokenizer st=new StringTokenizer(phoneFinal,",");
            while (st.hasMoreElements())
            {
                String tempMobileNumber = (String)st.nextElement();
                if(tempMobileNumber.length()>0 && message.trim().length()>0) {
                    sendSMS(tempMobileNumber, message);
                }
                else 
                {
                    Toast.makeText(getBaseContext(), 
                            "Please enter both phone number and message.", 
                            Toast.LENGTH_SHORT).show();
                }
            }
           }
    });  
    }
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
     if (resultCode == RESULT_OK)
     {  
         switch (requestCode) 
         {  
         case CONTACT_PICKER_RESULT:
             Cursor cursor=null;
             try
             {   
                 Uri result = data.getData();
                 Log.v(DEBUG_TAG, "Got a contact result: " + result.toString());

                 // get the contact id from the Uri     
                 String id = result.getLastPathSegment();

                 // query for everything contact number  
                 cursor = getContentResolver().query(  
                      Phone.CONTENT_URI, null,  
                      Phone.CONTACT_ID + "=?",  
                      new String[]{id}, null); 

                 cursor.moveToFirst();
                 int phoneIdx = cursor.getColumnIndex(Phone.DATA);  
                 if (cursor.moveToFirst())
                 {   
                     phonenofromcontact = cursor.getString(phoneIdx);
                     finallistofnumberstosendmsg +=","+phonenofromcontact;
                     Log.v(DEBUG_TAG, "Got phone no : " + phonenofromcontact);  
                 }
                 else 
                 {                                
                     Log.w(DEBUG_TAG, "No results"); 
                 }
             }
             catch(Exception e)
             {
                 Log.e(DEBUG_TAG, "Failed to get contact number", e);
             }
             finally
             {
                 if (cursor != null)
                 {  
                     cursor.close();
                 }
             }
             phonePhoneno= (EditText)findViewById(R.id.Phonenofromcontact);
             phonePhoneno.setText(finallistofnumberstosendmsg);
             //phonePhoneno.setText(phonenofromcontact);
             if(phonenofromcontact.length()==0)
             {
                 Toast.makeText(this, "No contact number found for this contact",
                         Toast.LENGTH_LONG).show(); 
             }
            break;  
         }  
     } 
     else
     {  
         Log.w(DEBUG_TAG, "Warning: activity result not ok");
     }  
 }  

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);       
}

}

}

// This class notify and receive messages

// 这个类通知和接收消息

public class SmsReceiver extends BroadcastReceiver {

公共类 SmsReceiver 扩展 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();
    }   
}

}

}

Thanks... rakesh

谢谢... rakesh

回答by Chris Thompson

What you need to do is register a BroadcastReceiverobject. Check out thisarticle for more information.

您需要做的是注册一个BroadcastReceiver对象。查看这篇文章了解更多信息。

If you want to hide SMS messages from the primary inbox, you'll need to delete them from the SMS ContentProvider and use your own SQLite database to store them. Also be sure to mark them as read in the content provider to remove the notification from the tray.

如果您想从主收件箱中隐藏 SMS 消息,您需要从 SMS ContentProvider 中删除它们并使用您自己的 SQLite 数据库来存储它们。还要确保在内容提供程序中将它们标记为已读以从托盘中删除通知。

回答by Hammad Akram

You can send your this received broadcast to your main activity using intent. And on your main activity receive this intent and append the data to the list view as a inbox.

您可以使用意图将收到的广播发送到您的主要活动。并在您的主要活动中接收此意图并将数据作为收件箱附加到列表视图中。

OR the bast but lengthy way

或粗野但漫长的方式

Add this data (received number and message) to the SQL database and on the main activity fatch the data from data base and append to the list view called inbox.In this way your inbox data will be saved even if the phone is switched off or if application is shut down.

将此数据(收到的号码和消息)添加到 SQL 数据库中,并在主要活动中从数据库中获取数据并附加到名为收件箱的列表视图中。这样,即使手机关闭或关闭,您的收件箱数据也将被保存如果应用程序被关闭。