Gửi SMS qua ý định


75

Tôi muốn gửi SMS qua mục đích, nhưng khi tôi sử dụng mã này, mã này sẽ chuyển hướng tôi đến một liên hệ sai:

Intent intentt = new Intent(Intent.ACTION_VIEW);         
intentt.setData(Uri.parse("sms:"));
intentt.setType("vnd.android-dir/mms-sms");
intentt.putExtra(Intent.EXTRA_TEXT, "");
intentt.putExtra("address",  phone number);
context.startActivity(intentt);

Tại sao?

Ngoài ra, tôi biết một cách để theo dõi quá trình gửi SMS, nhưng tôi không biết cách viết mã này:

Starting activity: Intent { 
   act=android.intent.action.SENDTO dat=smsto:%2B**XXXXXXXXXXXX** flg=0x14000000    
   cmp=com.android.mms/.ui.ComposeMessageActivity }

trong đó XXXXXXXXXXXX là số điện thoại.


Hãy thử đọc mã nguồn android, cả SmsManager.
JoxTraex

1
Người ta cũng có thể nhận được ActivityNotFoundException: No Activity found to handle Intent ("vnd.android-dir/mms-sms"). Tốt hơn là không sử dụng phương pháp này.
uniruddh

Câu trả lời:


88

Tôi đã phát triển chức năng này từ một Blog. Có 2 cách để bạn có thể gửi SMS.

  1. Mở trình soạn SMS gốc
  2. viết tin nhắn của bạn và gửi từ ứng dụng Android của bạn

Đây là mã của phương pháp thứ nhất.

Main.xml

<?xml version="1.0" encoding="utf-8"?>  
    <RelativeLayout  
        android:id="@+id/relativeLayout1"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        xmlns:android="http://schemas.android.com/apk/res/android">  

            <Button  
                android:id="@+id/btnSendSMS"  
               android:layout_height="wrap_content"  
               android:layout_width="wrap_content"  
               android:text="Send SMS"  
               android:layout_centerInParent="true"  
               android:onClick="sendSMS">  
           </Button>  
   </RelativeLayout>

Hoạt động

public class SendSMSActivity extends Activity {  
     /** Called when the activity is first created. */  
     @Override  
     public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);  
         setContentView(R.layout.main);  
      }  

     public void sendSMS(View v)  
     {  
         String number = "12346556";  // The number on which you want to send SMS  
         startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", number, null)));  
     }  
    /* or 
     public void sendSMS(View v) 
      { 
     Uri uri = Uri.parse("smsto:12346556"); 
         Intent it = new Intent(Intent.ACTION_SENDTO, uri); 
         it.putExtra("sms_body", "Here you can set the SMS text to be sent"); 
         startActivity(it); 
      } */  
 }

LƯU Ý: - Trong phương pháp này, bạn không yêu cầu quyền SEND_SMS bên trong tệp AndroidManifest.xml.

Đối với phương pháp thứ 2, hãy tham khảo BLOG này . Bạn sẽ tìm thấy một lời giải thích tốt từ đây.

Hy vọng điều này sẽ giúp bạn...


3
Một điều nữa, với mục đích thử nghiệm của ứng dụng này, bạn có thể mở 2 Trình giả lập; họ có id như 5554 & 5555 hoặc tương tự như vậy. Bạn sử dụng nó như một con số và kiểm tra nó.
Prem

Đây là cách làm việc duy nhất để gửi sms qua mục đích từ tất cả các thiết bị và phiên bản Android.
uniruddh

@ I-droid: bạn đang đề cập đến phương pháp nào?
Marco Altran

@MarcoAltran:sendSMS(View v)
uniruddh

@Prem Tốt nhất nên bao gồm nội dung từ nguồn của bạn và sau đó chỉ cần thêm tham chiếu vào nó. Các liên kết có thể bị phá vỡ sớm hay muộn và đột nhiên câu trả lời của bạn sẽ không chứa đầy đủ thông tin
Farzan

55
Uri uri = Uri.parse("smsto:YOUR_SMS_NUMBER");   
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);   
intent.putExtra("sms_body", "The SMS text");   
startActivity(intent);  

2
Điều này không hoạt động trên Android 4.0.3 (và tốt hơn?). Tôi phải sử dụng Intent.EXTRA_TEXT để thay thế. Bất kỳ ý tưởng tại sao?
wojciii

1
Chỉ cần kiểm tra điều này trên một vài thiết bị, chạy Android 6.0.1 và 4.4.4: trong mọi trường hợp đều "sms_body"hoạt động tốt, Intent.EXTRA_TEXTkhông hoạt động.
Jonik

34

Tạo ý định như thế này:

Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address","your desired phoneNumber");         
smsIntent.putExtra("sms_body","your desired message");
smsIntent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(smsIntent);

Đúng! Cảm ơn :) Nó đã giúp tôi.
1111161171159459134

Cảm ơn. đó là những gì tôi đang tìm kiếm
Sam

6

Hãy thử mã này. Nó sẽ hoạt động

Uri smsUri = Uri.parse("tel:123456");
Intent intent = new Intent(Intent.ACTION_VIEW, smsUri);
intent.putExtra("sms_body", "sms text");
intent.setType("vnd.android-dir/mms-sms"); 
startActivity(intent);

Hy vọng điều này sẽ giúp bạn.


Dường như có một cái gì đó sai tôi nhận được cảnh báo rằng việc thiết loại sẽ ghi đè lên các thiết lập URI
Janusz

3

Nếu bạn muốn một tin nhắn nhất định, hãy sử dụng cái này:

String phoneNo = "";//The phone number you want to text
String sms= "";//The message you want to text to the phone

Intent smsIntent = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", phoneNo, null));
smsIntent.putExtra("sms_body",sms);
startActivity(smsIntent);

2

Tạo Ý định như thế này:

   Uri uriSms = Uri.parse("smsto:1234567899");   
   Intent intentSMS = new Intent(Intent.ACTION_SENDTO, uriSms);   
   intentSMS.putExtra("sms_body", "The SMS text");   
   startActivity(intentSMS); 

Đâu là it.PutExtrađến từ đâu?
Nixon Kosgei

1

Hy vọng đây là công việc, điều này đang hoạt động trong ứng dụng của tôi

SmsManager.getDefault().sendTextMessage("Phone Number", null, "Message", null, null);

1
Cách này có cần sự cho phép của xã hội không?
Radon8472

Từ tài liệu: Sử dụng phương pháp này yêu cầu ứng dụng của bạn có quyền SEND_SMS.
shkschneider

Điều này cũng chỉ hoạt động nếu tin nhắn có 160 ký tự trở xuống. Nếu nó nhiều hơn 160, bạn phải sử dụng sendMultipartTextMessagethay vìsendTextMessage
Randy

1
Rất tiếc khi bỏ phiếu, phương pháp này yêu cầu quyền GỬI SMS và sẽ không được chấp nhận, Google sẽ không cho phép xuất bản ứng dụng trừ khi ứng dụng đó là ứng dụng SMS cốt lõi. Điều đó có nghĩa là chức năng chính của ứng dụng của bạn phải là SMS messenger, có một vài trường hợp ngoại lệ. Tuy nhiên, hầu hết các ứng dụng sẽ không được chấp thuận và sẽ bị từ chối trong quá trình triển khai.
Nhà phát triển MG

1
/**
 * Intent to Send SMS
 * 
 *
 * Extras:
 *
 * "subject"
 *      A string for the message subject (usually for MMS only).
 * "sms_body"
 *      A string for the text message.
 *  EXTRA_STREAM
 *      A Uri pointing to the image or video to attach.
 *
 *  For More Info:
 *  https://developer.android.com/guide/components/intents-common#SendMessage
 *
 * @param phoneNumber on which SMS to send
 * @param message text Message to send with SMS
 */
public void startSMSIntent(String phoneNumber, String message) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    // This ensures only SMS apps respond
    intent.setData(Uri.parse("smsto:"+phoneNumber));
    intent.putExtra("sms_body", message);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

0
  1. Quyền kê khai (bạn có thể đặt nó sau hoặc trước "ứng dụng")
 uses-permission android:name="android.permission.SEND_SMS"/>
  1. tạo một nút chẳng hạn và viết mã bên dưới (như đã viết trước đó Premtại chủ đề này) và thay thế phone_Number dưới đây bằng một số thực, nó sẽ hoạt động:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", "phone_Number", null)));

Chúng tôi không cần quyền SEND_SMS để gửi sms bằng một ý định.
Swapnil

0

Thêm try-catch nếu không điện thoại không có sim sẽ bị sập.

void sentMessage(String msg) {
    try {
        Intent smsIntent = new Intent(Intent.ACTION_VIEW);
        smsIntent.setType("vnd.android-dir/mms-sms");
        smsIntent.putExtra("sms_body", msg);
        startActivity(smsIntent);
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "No SIM Found", Toast.LENGTH_LONG).show();
    }
}

-1

Đây là một giải pháp khác sử dụng SMSManager:

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("PhoneNumber-example:+989147375410", null, "SMS Message Body", null, null);

1
Giải pháp này sẽ không còn được chấp nhận trừ khi nó là ứng dụng nhắn tin SMS cốt lõi.
Nhà phát triển MG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.