13 April 2013

การใช้ Intent สำหรับแชร์ข้อความ String ให้แอปอื่น

Updated on

        บทความนี้จะเป็นตัวอย่างการใช้ Intent นอกเหนือจากการเปิด Activity ใหม่ เพราะ Intent เป็นคลาสที่สามารถใช้งานได้มากกว่านั้นมากมาย เจ้าของบล็อกจึงขอทำเป็นตัวอย่างให้ผู้ที่หลงเข้ามาอ่านได้รู้ ว่าทำอะไรได้อีก

        สำหรับบทความนี้ก็จะเป็นการใช้ Intent สำหรับแชร์ข้อความที่เป็น Text ไปยังแอพต่างๆ ซึ่งระบบแอนดรอยด์มีการรองรับเรื่องการแชร์แล้ว ทำให้ไม่ต้องมานั่งทำเป็นรายชื่อแอพที่ต้องการมีให้เลือกเพื่อที่จะแชร์ แต่ระบบจะดึงรายชื่อแอพในเครื่องที่รองรับการแชร์ข้อความแบบ Text ดังนั้นที่ต้องทำก็จะมีแค่กำหนดข้อความที่จะแชร์ แล้วส่งไปด้วย Intent


        สำหรับการ Intent ร่วมกับแอพอื่นๆ จะมีหลักๆด้วยกันสองแบบคือ View กับ Send ซึ่งในกรณีของการแชร์ข้อความ Text จะเป็นแบบ Send

        จากเดิมที่เวลาจะใช้ Intent จะประกาศและกำหนดค่าให้กับตัวแปรดังนี้

Intent intent = new Intent(Main.this, Target.class);


        วิธีนี้สำหรับใช้ Intent เพื่อไปยังอีก Activity ที่เป็นของแอพนั้นๆ แต่ในการกำหนดเพื่อให้ทำงานเป็น Send จะต้องกำหนดดังนี้

Intent intent = new Inten(Intent.ACTION_SEND);


        และนอกจากกำหนดเป็น Send แล้ว สามารถกำหนดค่าต่างๆได้ด้วย

intent.setType("text/plain");


        คำสั่งดังกล่าวนี้เป็นการกำหนดประเภทของข้อมูลที่เก็บใน Intent จากตัวอย่างข้างบนนี้เป็นการกำหนดว่าเป็นข้อมูลแบบ Text นั่นเอง ดังนั้นเวลาที่ทำการแชร์ข้อมูล ระบบก็จะกรองรายชื่อตามรูปแบบข้อมูล แล้วแสดงขึ้นมาเฉพาะแอพที่สามารถรับข้อมูลแบบ Text ได้

        และในการกำหนดข้อมูล Text ที่จะให้แชร์ ก็จะเป็นดังนี้

intent.putExtra(Intent.EXTRA_TEXT, "ข้อความ");

        ในช่องข้อความให้กำหนดข้อมูล String ที่เป็นข้อความที่ต้องการแชร์ เมื่อกำหนดข้อมูลคร่าวๆครบแล้วก็เริ่มแชร์ได้เลยด้วยคำสั่ง

startActivity(Intent.createChooser(intent, "ชื่อหัวข้อ");

        ข้อความในคำสั่งนี้ก็คือ String ที่จะกำหนดข้อความตอนแชร์ (ดูรูปล่าง)


        ดังนั้น คำสั่งสำหรับแชร์ข้อความก็จะมีเท่านี้เอง รวมทั้งหมดได้ดังนี้

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "ข้อความที่จะแชร์");
startActivity(Intent.createChooser(intent, "ชื่อหัวข้อ"));


        นอกจากนี้ยังสามารถกำหนดอย่างอื่นเพิ่มเติมได้เช่นกันนะ เช่น กำหนด Subject หรือชื่อเรื่อง สำหรับเวลาที่แชร์ไปยังแอพที่เป็นอีเมลล์

intent.putExtra(Intent.EXTRA_SUBJECT, "ชื่อเรื่อง");


        ทีนี้ก็มาดูโค๊ดตัวอย่างของบทความนี้เลยดีกว่า

main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >
    
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:hint="Type to share"
        android:ems="10" />

    <Button
        android:id="@+id/buttonIntent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Share" />
    
</LinearLayout>


        สำหรับ Layout ของตัวอย่างนี้ก็มีแค่ Edit Text สำหรับใส่ข้อความที่จะแชร์ และ Button หนึ่งตัวที่กดแล้วนำข้อความใน Edit Text ไปแชร์ด้วย Intent


Main.java

package app.akexorcist.intentsharetext;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Main extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final EditText editText = (EditText)findViewById(R.id.editText);
        
        Button buttonIntent = (Button)findViewById(R.id.buttonIntent);
        buttonIntent.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT
                        , editText.getText().toString());
                startActivity(Intent.createChooser(intent, "Intent"));
            }
        });
    }
}

        โค๊ดตัวอย่างนี้คงไม่ต้องอธิบายละเอียดมากนัก เพราะแค่เป็นการนำข้อความใน Edit Text ไปแชร์


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.akexorcist.intentsharetext"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="app.akexorcist.intentsharetext.Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

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


        แอพ Facebook จะพิเศษหน่อย เพราะเมื่อเลือกเป็น Facebook จะพบว่าข้อความที่แชร์ไปไม่แสดง อันนี้ไม่ได้ผิดพลาดแต่อย่างใด แต่ทางผู้พัฒนาแอพของ Facebook ไม่ได้ทำให้รองรับอยู่แล้ว ซึ่งบังคับให้ใช้ Facebook SDK แทน (แต่ FB Messenger แชร์ได้ซะงั้น)

        สำหรับผู้ที่หลงเข้ามาอ่านคนใดต้องการไฟล์ตัวอย่าง สามารถดาวน์โหลดได้ที่ Intent Share Text [Google Drive]



บทความที่เกี่ยวข้อง

        การใช้ Intent สำหรับแชร์ข้อความ String [Send]
        การใช้ Intent สำหรับแชร์ข้อความสำหรับ Email [Send]
        การใช้ Intent เพื่อเปิด URL [View]
        การใช้ Intent เพื่อเปิดแผนที่ [View]
        การใช้ Intent เพื่อเปิดไฟล์ใดๆ [View]
        การเรียกเปิดแอพฯอื่นๆ ด้วย Intent
        การใช้ Intent สำหรับแชร์ไฟล์ใดๆ [Send]
        การเลือกไฟล์ภาพจาก Gallery ด้วย Intent [Result]
        การใช้งานกล้องเพื่อถ่ายภาพแบบง่ายๆด้วย Intent [Result]
        การใช้งานกล้องเพื่อบันทึกวีดีโอแบบง่ายๆด้วย Intent [Result]
        การอ่าน QR Code และ Barcode ด้วย Intent [Result]
        การรับข้อมูล Intent จากแอพฯอื่นๆ [Get Content]
        การรับข้อมูล Intent จากแอพฯอื่นแล้วส่งข้อมูลกลับไป [Result Content]