เปิดตัวแอปพลิเคชัน SMS ด้วยเจตนา


144

ฉันมีคำถามเกี่ยวกับเจตนา ... ฉันพยายามเปิดแอพ 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);

ดังนั้นคุณจะเห็นว่าฉันตั้งใจทำสิ่งต่าง ๆ มากเกินไป แต่นั่นเป็นเพราะฉันไม่รู้ว่าฉันจะทำได้อย่างไร ... ขอบคุณ


1
ชำระเงินgist.github.com/gelldur/9c199654c91b13478979คุณสามารถแชร์โดยแอพ SMS
Dawid Drozd

คำตอบ:


238

ในการเริ่มต้นกิจกรรม SMS สิ่งที่คุณต้องมีคือ:

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

คุณสามารถเพิ่มความพิเศษเพื่อเติมข้อความของคุณเองและเช่นนี้

sendIntent.putExtra("sms_body", x); 

จากนั้นเพียงแค่เริ่มการทำกิจกรรมด้วยความตั้งใจ

startActivity(sendIntent);

ฉันพยายามแล้ว แต่เมื่อฉันเขียนสิ่งที่คุณให้อย่างแน่นอน eclipse console return (เมื่อรวบรวม) "ไม่พบกิจกรรม Launcher!"
Olivier69

ตกลงคุณมีกิจกรรมที่มีคุณลักษณะต่อไปนี้ในตัวกรองเจตนาในรายการของคุณหรือไม่ <action android: name = "android.intent.action.MAIN" /> <หมวดหมู่ android: name = "android.intent.category.LAUNCHER" />
jqpubliq

อันที่จริงการเปิดตัวมาจากแอพพลิเคชั่นผลประโยชน์ Perh'aps มันมาจากที่นี่ฉันใส่สิ่งที่คุณทำไว้ในรายการและไม่มีอะไรเกิดขึ้น ... ฉันได้ทดสอบปุ่มของฉันกับฟังก์ชั่นอื่น ๆ และอันนี้ไม่ต้องการไป !!
Olivier69

22
เพื่อรวมหมายเลขโทรศัพท์ในช่อง 'เป็น' โดยอัตโนมัติให้เปลี่ยนรหัสบรรทัด setData เป็นsendIntent.setData(Uri.parse("sms:" + phoneNumber));(ขอบคุณ jqpubliq และ jaydeepw)
tmr

2
ฉันต้องตรวจสอบ SMS ว่ามีการส่งหรือไม่เมื่อผู้ใช้จะส่ง SMS จากแอพของฉันผ่านทาง Intent ti sms ฉันจะทำสิ่งนี้ได้อย่างไร
ผู้ใช้

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
ทางออกที่ดีที่สุด! ขอบคุณ!
Nick

20
ระวังสิ่งนี้จะไม่ทำงานสำหรับ Android 4.4 และอาจสูงกว่า ... "ไม่รองรับ vnd.android-dir / mms-sms"
Max Ch

2
เพิ่งทดสอบบน Android 4.4.2 และใช้งานได้ คุณช่วยเชื่อมโยงฉันกับประกาศนั้นได้ไหม @MaxCh
theknut

3
หากหมายเลขโทรศัพท์ไม่ถูกเพิ่มเช่นในกรณีของฉันเพียงเพิ่ม: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) }
เหงียนมินห์บินห์

49

หาก Android version เป็น Kitkat ขึ้นไปผู้ใช้สามารถเปลี่ยนแอปพลิเคชั่น sms เริ่มต้นได้ วิธีนี้จะได้รับแอป SMS เริ่มต้นและเริ่มต้นแอป SMS เริ่มต้น

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
ฉันใช้รุ่น KitKat ฉันต้องการตั้งค่าหมายเลขผู้รับในช่องถึง ฉันจะตั้งค่าอย่างไร
Karthikeyan Ve

3
@KarthikeyanVe ได้โปรดลองดูหน่อยได้ไหม? เจตนา sendIntent = เจตนาใหม่ (Intent.ACTION_SENDTO); sendIntent.setData (Uri.parse ( "smsto: PHONENUMBER"));
android_developer

ฉันเหนื่อย. มันทำงานได้ดี แต่เมื่อฉันคลิกปุ่มย้อนกลับจากแอพข้อความมันจะปิดแอพของฉันด้วย ถ้าฉันกดกลับจากแอพข้อความมันควรกลับไปที่แอพของฉันที่ฉันไป
Karthikeyan Ve

2
คำตอบที่ดี ใช้หากคุณต้องการไปที่แอพ SMS เริ่มต้นโดยตรงใช้งานได้อย่างมีเสน่ห์ หากคุณต้องการตัวเลือกดูคำตอบอื่น ๆ ที่นี่
Nemanja Kovacevic

1
ทำไมแอปปิดเมื่อฉันกลับมาจากข้อความ
Muhammad Younas

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

นั่นคือทั้งหมดที่คุณต้องการ


รหัสทำงานบน Android 4.2.2 จะเปิดมุมมองรายการสำหรับ SMS นั่นคือสิ่งที่ฉันต้องการ !!!
VISHAL VIRADIA

22

หากคุณต้องการเปิดกิจกรรมการเขียน SMS จากกิจกรรมอื่น ๆ ของคุณและคุณต้องส่งหมายเลขโทรศัพท์และข้อความ SMS ให้ใช้รหัสนี้:

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

หมายเหตุ:นี่คือsms_bodyและsmsto:เป็นกุญแจสำคัญสำหรับการจดจำข้อความและหมายเลขโทรศัพท์ที่ SMS ประกอบกิจกรรมดังนั้นควรระมัดระวังที่นี่


แอปปิดเมื่อเริ่มข้อความแจ้งเตือนหรือเมื่อฉันกดปุ่มย้อนกลับปิดแอป
Muhammad Younas

แรกของทุกบอกฉันเมื่อคุณรันโค้ดนี้แล้วไม่ได้เปิดฟังก์ชั่นการเขียน SMS, ถ้าปิด app หลังจากกดปุ่มกลับมาแล้วจะมีปัญหาบางอย่างในรหัสของคุณ epecially ในที่สาธารณะเป็นโมฆะ BackPressed () {} ฟังก์ชั่นเช่นนี้
พ่อ Fahim Shah

ฉันไม่ได้เขียนทับ BackPresed Functionn
Muhammad Younas

17

นี่คือรหัสที่จะเปิดกิจกรรม SMS ที่เติมไว้ล่วงหน้าพร้อมกับหมายเลขโทรศัพท์ที่จะต้องส่ง SMS นี้ทำงานได้ดีในโปรแกรมจำลองเช่นเดียวกับอุปกรณ์

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
ฉันจะแนบรูปภาพกับข้อความนี้ได้อย่างไร
unresolved_external

ฉันคำถาม 1 ข้อเกี่ยวกับเรื่องนี้ถ้าเราเห็นโค้ดเฟรมเวิร์ก setType () ทำให้ข้อมูลเป็นโมฆะ & setData () ทำให้ประเภทเป็นโมฆะ ดังนั้นประเภทจะยังคงอยู่ในกรณีนี้อย่างไร
AndroidGuy

เราจะเปลี่ยนแบบอักษรของข้อความใน sms ได้อย่างไร
jyomin

5

ใช้

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

1
สิ่งนี้ใช้ได้กับฉันด้วยแอพสต็อคเช่นบนอีมูเลเตอร์ แต่มันอาจไม่ทำงานบน Galaxy S3
G. Lombard

1
@ G.Lombard Lombard ใช่รหัสนี้ใช้ไม่ได้กับ s3 ทางออกใดสำหรับ s3?
Vivek Kumar Srivastava


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

สำหรับ SDK_INT> = 19 (ที่ api นี้พร้อมใช้งาน) ใช้งานได้ ในความเป็นจริงเป็นทางออกเดียวใน Nexus 6 ของฉันกับ Nougat หากคุณต้องการเปิดแอพ sms พร้อมรายการข้อความ
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
}

วิธีที่ดีที่สุดในการทำเช่นนี้


รหัสนี้ใช้ได้กับฉันเท่านั้น ... อย่างไรก็ตามวิธีการหลีกเลี่ยงการเลือกแอพ sms หลายตัว ... ค่าเริ่มต้นเท่านั้นที่จะเริ่ม ..
Mahbubur Rahman Khan

3

คุณสามารถเปิดแอป sms เริ่มต้นและส่งรายละเอียดดังนี้:
หมายเหตุ: หากคุณต้องการส่งไปยังหมายเลขจำนวนมากให้คั่นแต่ละหมายเลขด้วย ";" ภายในสตริง

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

| หรือ | ใช้ฟังก์ชั่นนี้:

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

สิ่งนี้แสดงสองตัวเลือกคือ 1. Hangout และ 2. แอปข้อความเริ่มต้น ฉันต้องการเปิดแอพข้อความ Android เราจะเก็บถาวรสิ่งนั้นได้อย่างไร
Milind Mevada

3

ในkotlinสามารถดำเนินการได้ง่าย ๆ ดังนี้

/**
 * 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)
    }
}

นี่คือคำตอบที่แก้ไขแล้วของ @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

รหัสที่ดีที่สุดที่ทำงานร่วมกับแอพ SMS เริ่มต้นคือ

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

รหัสด้านล่างใช้งานได้กับ android 6.0
มันจะเปิดกิจกรรมการค้นหาในแอปพลิเคชันการส่งข้อความเริ่มต้นพร้อมการสนทนาที่เกี่ยวข้องกับสตริงที่ระบุ

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

คุณสามารถเริ่มต้นกิจกรรมการค้นหาด้วยความตั้งใจ นี่จะเป็นการเปิดกิจกรรมการค้นหาของแอปพลิเคชั่นส่งข้อความเริ่มต้น ตอนนี้เพื่อแสดงรายการการสนทนาที่เฉพาะเจาะจงในกิจกรรมการค้นหาคุณสามารถระบุสตริงการค้นหาเป็นสตริงพิเศษด้วยคีย์เป็น

"intent_extra_data_key"

ตามที่ปรากฏใน onCreate ของคลาสนี้

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;

นอกจากนี้คุณยังสามารถส่ง SENDER_ADDRESS ของ sms เป็นสตริงพิเศษซึ่งจะแสดงรายการการสนทนาทั้งหมดด้วยที่อยู่ผู้ส่งเฉพาะนั้น

ตรวจสอบcom.android.mms.ui.SearchActivityสำหรับข้อมูลเพิ่มเติม

คุณสามารถตรวจสอบคำตอบนี้ได้


0

ในโปรแกรมจำลองการทำงานนี้สำหรับฉัน

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

เขียน 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

คุณสามารถใช้สิ่งนี้ได้ทั้งคู่ทำงานได้ดีบน Android ด้านบน 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);

หรือ

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

0

คุณสามารถใช้ข้อมูลโค้ดต่อไปนี้เพื่อให้บรรลุเป้าหมายของคุณ:

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

หากคุณไม่ต้องการข้อความใด ๆ ให้ลบคีย์ sms_body

Intent smsIntent = new Intent(Intent.ACTION_SENDTO);
smsIntent.setData(Uri.parse("smsto:"+shopkepperDataModel.getPhoneNo().trim()));
smsIntent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(smsIntent);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.