【问题标题】:Creating a SMS Application in Android?在 Android 中创建 SMS 应用程序?
【发布时间】:2015-06-17 15:00:57
【问题描述】:

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

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

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

我想接收短信并将其放入我自己的收件箱。如何创建此收件箱?我希望它与普通收件箱一样工作。

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

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

Android 是否可以监听特定端口号的短信?

【问题讨论】:

  • 您应该为这个问题选择一个可接受的答案。谢谢

标签: android sms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    通过它并尝试实现它..

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

    }

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

    公共类 SmsReceiver 扩展广播接收器 {

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

    }

    谢谢... 拉克什

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 如何开发它可以告诉我@Chris Thompson
      【解决方案4】:

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

      或者粗暴但漫长的方式

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多