khởi chạy ứng dụng sms với một ý định


144

Tôi có một câu hỏi về một ý định ... Tôi cố gắng khởi chạy ứng dụng sms ...

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setType("vnd.android-dir/mms-sms");
int flags = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |
    Intent.FLAG_ACTIVITY_CLEAR_TOP;
intent.setFlags(flags);
intent.setData(Uri.parse("content://sms/inbox"));
context.startActivity(intent);

vì vậy, bạn có thể thấy rằng tôi đặt quá nhiều thứ vào ý định của mình, nhưng đó là vì tôi không biết làm thế nào tôi có thể làm được ... Cảm ơn


1
Thanh toán gist.github.com/gelldur/9c199654c91b13478979 Bạn có thể chia sẻ bằng ứng dụng SMS
Dawid Drozd

Câu trả lời:


238

Để bắt đầu khởi chạy hoạt động sms, tất cả những gì bạn cần là:

Intent sendIntent = new Intent(Intent.ACTION_VIEW);         
sendIntent.setData(Uri.parse("sms:"));

Bạn có thể thêm các tính năng bổ sung để điền thông điệp của riêng bạn và như thế này

sendIntent.putExtra("sms_body", x); 

sau đó chỉ cần startActivity với ý định.

startActivity(sendIntent);

Tôi đã thử, nhưng khi tôi viết chính xác những gì bạn cung cấp, bảng điều khiển nhật thực trở lại (khi biên dịch) "Không tìm thấy hoạt động Trình khởi chạy!"
Olivier69

được rồi, bạn có một hoạt động với các thuộc tính sau trong bộ lọc ý định của nó trong tệp kê khai của bạn không? <hành động android: name = "android.intent.action.MAIN" /> <danh mục android: name = "android.intent.carget.LAUNCHER" />
jqpubliq

trong thực tế, sự ra mắt đến từ một ứng dụng phụ. Sau khi nó đến từ đây, tôi đã đưa ra những gì bạn đã làm trong bảng kê khai và không có gì xảy ra ... Tôi đã kiểm tra nút của mình với một chức năng khác và điều này không muốn đi !!
Olivier69

22
để tự động bao gồm số điện thoại trong hộp 'thành', thay đổi dòng mã setData thành sendIntent.setData(Uri.parse("sms:" + phoneNumber));(cảm ơn bạn jqpubliq và jaydeepw)
tmr

2
Tôi có cần kiểm tra SMS có được gửi hay không khi người dùng sẽ gửi sms từ ứng dụng của tôi thông qua Intent ti sms làm thế nào tôi có thể làm điều này?
người dùng

139
Intent smsIntent = new Intent(Intent.ACTION_VIEW);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.putExtra("address", "12125551212");
smsIntent.putExtra("sms_body","Body of Message");
startActivity(smsIntent);

4
Giải pháp tốt nhất! Cảm ơn!
Nick

20
Xin lưu ý, điều này sẽ không hoạt động cho Android 4.4 và có thể lên ... "vnd.android-dir / mms-sms" không còn được hỗ trợ
Max Ch

2
Chỉ cần thử nghiệm trên Android 4.4.2 và nó đang hoạt động. Bạn có thể vui lòng liên kết tôi với thông báo đó? @MaxCh
theknut

3
Nếu số điện thoại không được thêm vào như trong trường hợp của tôi, chỉ cần thêm:intent.setData(Uri.parse("smsto:" + phoneNumber));
Utopia

4
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
Nguyễn Minh Bình

49

Nếu phiên bản Android là Kitkat trở lên, người dùng có thể thay đổi ứng dụng sms mặc định. Phương pháp này sẽ nhận được ứng dụng sms mặc định và bắt đầu ứng dụng sms mặc định.

private void sendSMS() {    
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) // At least KitKat
      {
         String defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(this); // Need to change the build to API 19

         Intent sendIntent = new Intent(Intent.ACTION_SEND);
         sendIntent.setType("text/plain");
         sendIntent.putExtra(Intent.EXTRA_TEXT, "text");

         if (defaultSmsPackageName != null)// Can be null in case that there is no default, then the user would be able to choose
         // any app that support this intent.
         {
            sendIntent.setPackage(defaultSmsPackageName);
         }
         startActivity(sendIntent);

      }
      else // For early versions, do what worked for you before.
      {
         Intent smsIntent = new Intent(android.content.Intent.ACTION_VIEW);
         smsIntent.setType("vnd.android-dir/mms-sms");
         smsIntent.putExtra("address","phoneNumber");         
         smsIntent.putExtra("sms_body","message");
         startActivity(smsIntent);
      }
   }

2
Tôi đang sử dụng phiên bản KitKat. Tôi muốn đặt số người nhận trong trường Đến. Làm thế nào tôi có thể thiết lập điều đó?
Karthikeyan Ve

3
@KarthikeyanVe bạn có thể thử không? Intent sendIntent = new Intent (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ("smsto: phonenumber"));
android_developer

Tôi đã thử. Nó hoạt động tốt. Nhưng khi tôi nhấp vào nút quay lại từ ứng dụng tin nhắn, nó cũng sẽ đóng ứng dụng của tôi. Nếu tôi nhấn lại từ ứng dụng tin nhắn, nó sẽ trở lại ứng dụng của tôi nơi tôi rời đi.
Karthikeyan Ve

2
Câu trả lời chính xác. Sử dụng nếu bạn muốn truy cập trực tiếp vào ứng dụng SMS mặc định, hoạt động như bùa mê. Nếu bạn muốn người chọn xem các câu trả lời khác ở đây.
Nemanja Kovacevic

1
Tại sao ứng dụng đóng khi tôi quay lại từ tin nhắn
Muhammad Younas

31
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

Đó là tất cả những gì bạn cần.


mã đang hoạt động trên Android 4.2.2, nó mở chế độ xem danh sách cho sms. đó là những gì tôi cần !!!
VIRADIA

22

Nếu bạn muốn khởi chạy hoạt động Soạn tin nhắn SMS từ một số hoạt động khác của mình và bạn cũng phải chuyển một số điện thoại và tin nhắn SMS, thì hãy sử dụng mã này:

Uri sms_uri = Uri.parse("smsto:+92xxxxxxxx"); 
Intent sms_intent = new Intent(Intent.ACTION_SENDTO, sms_uri); 
sms_intent.putExtra("sms_body", "Good Morning ! how r U ?"); 
startActivity(sms_intent); 

Lưu ý: ở đây sms_bodysmsto: là chìa khóa để nhận dạng văn bản và điện thoại không có trong hoạt động soạn tin nhắn SMS, vì vậy hãy cẩn thận ở đây.


ứng dụng đóng khi nó bắt đầu có ý định nhắn tin hoặc khi tôi nhấn lại ứng dụng chính đã đóng
Muhammad Younas

Trước hết hãy cho tôi biết khi bạn thực thi mã này, sau đó nó có mở chức năng ghi sms không, nếu ứng dụng đóng sau khi nhấn nút quay lại thì sẽ có một số vấn đề trong mã của bạn, đặc biệt là trong chức năng công khai BackPression () {} như thế này
Pir Fahim Shah

tôi đã không ghi đè chức năng BackPresed
Muhammad Younas

17

Dưới đây là mã sẽ mở hoạt động SMS được điền trước bằng số điện thoại mà SMS phải được gửi. Điều này hoạt động tốt trên trình giả lập cũng như thiết bị .

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
smsIntent.setType("vnd.android-dir/mms-sms");
smsIntent.setData(Uri.parse("sms:" + phoneNumber));
startActivity(smsIntent);

1
Làm thế nào tôi có thể đính kèm một hình ảnh vào tin nhắn này?
unresolve_external

Tôi có 1 câu hỏi liên quan đến vấn đề này, nếu chúng ta thấy mã khung, setType () làm cho dữ liệu là null & setData () làm cho loại là null. Vậy làm thế nào loại sẽ tồn tại trong trường hợp này?
AndroidGuy

làm thế nào chúng ta có thể thay đổi phông chữ của văn bản trong sms
jyomin 20/07/2015

5

Sử dụng

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName("com.android.mms", "com.android.mms.ui.ConversationList");

1
Điều này hoạt động với tôi với ứng dụng chứng khoán, ví dụ như trên trình giả lập, nhưng có lẽ nó không hoạt động trên Galaxy S3.
G. Lombard

1
@ G.Lombard Lombard Có mã này không hoạt động trên s3. giải pháp nào cho s3?
Vivek Kumar Srivastava

4

Tôi sử dụng:

Intent sendIntent = new Intent(Intent.ACTION_MAIN);
sendIntent.putExtra("sms_body", "text");
sendIntent.setType("vnd.android-dir/mms-sms");
startActivity(sendIntent);

4
Intent eventIntentMessage =getPackageManager()
 .getLaunchIntentForPackage(Telephony.Sms.getDefaultSmsPackage(getApplicationContext));
startActivity(eventIntentMessage);

Đối với SDK_INT> = 19 (nơi api này khả dụng), nó hoạt động. Thực tế là giải pháp hoạt động duy nhất trong Nexus 6 của tôi với Nougat nếu bạn muốn mở ứng dụng sms với danh sách tin nhắn
lujop

3
try {
    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.setData(Uri.parse("smsto:" + Uri.encode(number)));
    smsIntent.putExtra("address", number);
    smsIntent.putExtra("sms_body", message);

    PackageManager pm = activity.getPackageManager();
    List<ResolveInfo> resInfo = pm.queryIntentActivities(smsIntent, 0);

    for (int i = 0; i < resInfo.size(); i++) {
        ResolveInfo ri = resInfo.get(i);
        String packageName = ri.activityInfo.packageName;

        if (packageName.contains("sms")) {
            //Log.d("TAG", packageName + " : " + ri.activityInfo.name);
            smsIntent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
        }
    }
    activity.startActivity(smsIntent);
} catch (Exception e) {
    // Handle Error
}

Cách tốt nhất để làm điều này.


Chỉ có mã này hoạt động với tôi ... Tuy nhiên, làm thế nào để tránh lựa chọn nhiều ứng dụng sms ... chỉ mặc định sẽ bắt đầu ..
Mahbubur Rahman Khan

3

Bạn có thể mở Ứng dụng sms mặc định và chuyển chi tiết như sau:
Lưu ý: Nếu bạn muốn gửi đến nhiều số, hãy tách từng số bằng ";" chuỗi bên trong

String mblNumVar = "9876543210;9123456789";
Intent smsMsgAppVar = new Intent(Intent.ACTION_VIEW);
smsMsgAppVar.setData(Uri.parse("sms:" +  mblNumVar));
smsMsgAppVar.putExtra("sms_body", "Hello Msg Tst Txt");
startActivity(smsMsgAppVar);

| Hoặc | Sử dụng chức năng này:

void openSmsMsgAppFnc(String mblNumVar, String smsMsgVar)
{
    Intent smsMsgAppVar = new Intent(Intent.ACTION_VIEW);
    smsMsgAppVar.setData(Uri.parse("sms:" +  mblNumVar));
    smsMsgAppVar.putExtra("sms_body", smsMsgVar);
    startActivity(smsMsgAppVar); 
}

Điều này cho thấy hai tùy chọn, 1. hangout và 2. ứng dụng tin nhắn mặc định. Tôi muốn mở mạnh mẽ ứng dụng tin nhắn Android. Làm thế nào chúng ta có thể lưu trữ đó?
Milind Mevada

3

Trong kotlin điều này có thể được thực hiện dễ dàng như sau:

/**
 * If android version is Kitkat or above, users can change default sms application.
 * This method will get default sms app and start default sms app.
 */
private fun openSMS() {
    val message = "message here"
    val phone = "255754......." //255 Tanzania code.

    val uri = Uri.parse("smsto:+$phone")
    val intent = Intent(Intent.ACTION_SENDTO, uri)

    with(intent) {
        putExtra("address", "+$phone")
        putExtra("sms_body", message)
    }

    when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT -> {
            //Getting the default sms app.
            val defaultSmsPackageName = Telephony.Sms.getDefaultSmsPackage(context)

            // Can be null in case that there is no default, then the user would be able to choose
            // any app that support this intent.
            if (defaultSmsPackageName != null) intent.setPackage(defaultSmsPackageName)

            startActivity(intent)
        }
        else -> startActivity(intent)
    }
}

Đây là câu trả lời sửa đổi của @mustafasevgi


2
Intent sendIntent = new Intent(Intent.ACTION_SEND); 
//CHANGE YOUR MESSAGING ACTIVITY HERE IF REQUIRED 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("sms_body",msgbody); 
sendIntent.putExtra("address",phonenumber);
//FOR MMS
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/mms.png"));
sendIntent.setType("image/png");
startActivity(sendIntent);

2

Mã tốt nhất hoạt động với ứng dụng SMS mặc định là.

Uri SMS_URI = Uri.parse("smsto:+92324502****"); //Replace the phone number
Intent sms = new Intent(Intent.ACTION_VIEW,SMS_URI);    
sms.putExtra("sms_body","This is test message"); //Replace the message witha a vairable 
startActivity(sms);

1

Đoạn mã dưới đây hoạt động trên Android 6.0.
Nó sẽ mở hoạt động tìm kiếm trong ứng dụng nhắn tin mặc định với các cuộc hội thoại liên quan đến chuỗi cụ thể được cung cấp.

Intent smsIntent = new Intent(Intent.ACTION_MAIN);
        smsIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        smsIntent.setClassName("com.android.mms", "com.android.mms.ui.SearchActivity");
        smsIntent.putExtra("intent_extra_data_key", "string_to_search_for");
        startActivity(smsIntent);  

Bạn có thể bắt đầu hoạt động tìm kiếm với một ý định. Điều này sẽ mở hoạt động tìm kiếm của ứng dụng nhắn tin mặc định. Bây giờ, để hiển thị danh sách các cuộc hội thoại cụ thể trong hoạt động tìm kiếm, bạn có thể cung cấp chuỗi tìm kiếm dưới dạng chuỗi bổ sung với khóa như

"aim_extra_data_key"

như được hiển thị trong onCreate của lớp này

String searchStringParameter = getIntent().getStringExtra(SearchManager.QUERY);
    if (searchStringParameter == null) {
        searchStringParameter = getIntent().getStringExtra("intent_extra_data_key" /*SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA*/);
    }
    final String searchString = searchStringParameter != null ? searchStringParameter.trim() : searchStringParameter;

Bạn cũng có thể chuyển SENDER_ADDRESS của sms dưới dạng chuỗi bổ sung, sẽ liệt kê tất cả các cuộc hội thoại với địa chỉ người gửi cụ thể đó.

Kiểm tra com.android.mms.ui.SearchActivity để biết thêm thông tin

Bạn cũng có thể kiểm tra câu trả lời này


0

trên trình giả lập công việc này cho tôi

Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", number, null));
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.putExtra("sms_body", remindingReason);

                startActivity(i);

0

Ý định của Sms:

Intent intent = new Intent("android.intent.action.VIEW");
        /** creates an sms uri */
        Uri data = Uri.parse("sms:");
        intent.setData(data);

0

Soạn tin nhắn SMS:

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

0

Bạn có thể sử dụng cái này, cả hai đều hoạt động tốt trên Android trên 4.4

    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.setType("vnd.android-dir/mms-sms");
    smsIntent.putExtra("address","9212107320");
    smsIntent.putExtra("sms_body","Body of Message");
    startActivity(smsIntent);

hoặc là

    Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.putExtra("sms_body","Body of Message");
    smsIntent.setData(Uri.parse("sms:9212107320"));
    startActivity(smsIntent);

0

Bạn có thể sử dụng đoạn mã sau để đạt được mục tiêu của mình:

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+model.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
smsIntent.putExtra("sms_body","Hello this is dummy text");
startActivity(smsIntent);

Nếu bạn không muốn bất kỳ văn bản nào thì hãy xóa khóa sms_body.

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
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.