# คู่มือการผสานการทำงานพื้นฐานของ Android SDK

ส่วนนี้มีข้อมูลเกี่ยวกับวิธีผสานการทำงาน Pushwoosh SDK เข้ากับแอปพลิเคชัน Android ของคุณ

## ข้อกำหนดเบื้องต้น

ในการผสานการทำงาน Pushwoosh Android SDK เข้ากับแอปของคุณ คุณจะต้องมีสิ่งต่อไปนี้:

<TranslatedFragment id="prerequisites-android" />

## ขั้นตอนการผสานการทำงาน


### 1. ตั้งค่า Firebase Cloud Messaging

ขั้นแรก เชื่อมต่อโปรเจกต์ Android ของคุณกับ Firebase:

- เปิดโปรเจกต์ของคุณใน Android Studio
- ไปที่ **Tools > Firebase > Cloud Messaging** และคลิก "Set up Firebase Cloud Messaging"
- ทำตามคำแนะนำของ wizard ในขั้นตอนสุดท้าย wizard จะเพิ่ม dependency ที่จำเป็นลงในไฟล์ `build.gradle` ของคุณ

### 2. เพิ่ม Pushwoosh SDK

เพิ่ม dependency ของไลบรารี pushwoosh ลงใน build.gradle ของแอปพลิเคชันของคุณ:

```groovy title="build.gradle"
implementation 'com.pushwoosh:pushwoosh-firebase:6.+'
```

แทนที่ "+" ด้วยเวอร์ชันปัจจุบันของ [Pushwoosh Android SDK](https://github.com/Pushwoosh/pushwoosh-android-sdk/releases/latest)

### 3. เพิ่มข้อมูลเมตาของ Pushwoosh ไปยัง AndroidManifest.xml

เปิดไฟล์ AndroidManifest.xml ของคุณและเพิ่มข้อมูลเมตาต่อไปนี้ภายในแท็ก `<application>`:

```xml
<meta-data android:name="com.pushwoosh.appid" android:value="__YOUR_APP_CODE__" />
<meta-data android:name="com.pushwoosh.apitoken" android:value="__YOUR_DEVICE_API_TOKEN__" />
```

โดยที่:
- `com.pushwoosh.appid` คือ Pushwoosh Application Code ของคุณ
- `com.pushwoosh.apitoken` คือ [Pushwoosh Device API Token](/th/developer/api-reference/api-access-token/#device-api-token) ของคุณ

> **สำคัญ:** ตรวจสอบให้แน่ใจว่าได้ให้สิทธิ์การเข้าถึงของ token กับแอปที่ถูกต้องใน Pushwoosh Control Panel ของคุณ [เรียนรู้เพิ่มเติม](/th/developer/api-reference/api-access-token/#edit-token)

### 4. โค้ดการเริ่มต้น

ลงทะเบียนเพื่อรับ push notifications โดยเพิ่มโค้ดนี้ลงในตรรกะการเริ่มต้นของคุณ:

```java
Pushwoosh.getInstance().registerForPushNotifications()
```

### 5. รันโปรเจกต์

1. บิวด์และรันโปรเจกต์
2. ไปที่ Pushwoosh Control Panel และ [ส่ง push notification](/th/product/messaging-channels/push-notifications/send-push-notifications/one-time-push)
3. คุณควรจะเห็นการแจ้งเตือนในแอป

## การผสานการทำงานเพิ่มเติม

ณ จุดนี้ คุณได้ผสานการทำงาน SDK เรียบร้อยแล้วและสามารถส่งและรับ push notifications ได้ ตอนนี้เรามาดูฟังก์ชันการทำงานหลักกัน

### Push notifications

ใน Pushwoosh SDK มี callbacks สองตัวที่ออกแบบมาเพื่อจัดการกับ push notifications:
- `onMessageReceived`: เมธอดนี้จะถูกเรียกใช้เมื่อได้รับ push notification
- `onMessageOpened`: เมธอดนี้จะถูกเรียกเมื่อผู้ใช้โต้ตอบกับ (เปิด) การแจ้งเตือน

callbacks เหล่านี้ช่วยให้นักพัฒนาสามารถจัดการการรับและการโต้ตอบของผู้ใช้กับ push notifications ภายในแอปพลิเคชันของตนได้:

```xml title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.notification_service_extension"
    android:value="com.your.package.YourNotificationServiceExtension" />
```

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import android.util.Log
import com.pushwoosh.notification.NotificationServiceExtension
import com.pushwoosh.notification.PushMessage

class YourNotificationServiceExtension : NotificationServiceExtension() {
    
    override fun onMessageReceived(data: PushMessage): Boolean {
        Log.d("Pushwoosh", "onMessageReceived: ${data.toJson()}")
        return false
    }

    override fun onMessageOpened(message: PushMessage) {
        Log.d("Pushwoosh", "onMessageOpened: ${message.toJson()}")
    }

}
```
</TabItem>
<TabItem label="Java">
```java
import android.util.Log;
import com.pushwoosh.notification.NotificationServiceExtension;
import com.pushwoosh.notification.PushMessage;

public class YourNotificationServiceExtensionJava extends NotificationServiceExtension {

    @Override
    public boolean onMessageReceived(PushMessage data) {
        Log.d("Pushwoosh", "onMessageReceived: " + data.toJson());
        return false;
    }

    @Override
    public void onMessageOpened(PushMessage message) {
        Log.d("Pushwoosh", "onMessageOpened: " + message.toJson());
    }
}
```
</TabItem>
</Tabs>

### การกำหนดค่าผู้ใช้

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

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import com.pushwoosh.Pushwoosh
import com.pushwoosh.tags.TagsBundle
import java.util.Date

class Registration {

    public void afterUserLogin(User user) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance()

        // Set user ID
        if (user.getUserId() != null) {
            pushwoosh.setUserId(user.getUserId())
        }

        // Set user email
        if (user.getEmail() != null) {
            pushwoosh.setEmail(user.getEmail())
        }

        // Setting additional user information as tags for Pushwoosh
        if (user.getUserDetails() != null) {
            val details = user.getUserDetails()
            val tagsBuilder = TagsBundle.Builder()
            
            if (details.getAge() != null) {
                tagsBuilder.putInt("age", details.getAge())
            }
            
            if (details.getUserName() != null) {
                tagsBuilder.putString("name", details.getUserName())
            }
            
            if (details.lastLoginDate() != null) {
                tagsBuilder.putDate("last_login", details.getLastLoginDate())
            }
            
            // Build and send tags
            val tags = tagsBuilder.build()
            if (!tags.isEmpty()) {
                pushwoosh.setTags(tags)
            }
        }
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import com.pushwoosh.Pushwoosh;
import com.pushwoosh.tags.TagsBundle;
import java.util.Date;

public class Registration {

    public void afterUserLogin(User user) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance();

        // Set user ID
        if (user.getUserId() != null) {
            pushwoosh.setUserId(user.getUserId());
        }

        // Set user email
        if (user.getEmail() != null) {
            pushwoosh.setEmail(user.getEmail());
        }

        // Set user SMS number
        if (user.getSmsNumber() != null) {
            pushwoosh.registerSMSNumber(user.getSmsNumber());
        }

        // Set user WhatsApp number
        if (user.getWhatsAppNumber() != null) {
            pushwoosh.registerWhatsappNumber(user.getWhatsAppNumber());
        }

        // Setting additional user information as tags for Pushwoosh
        if (user.getUserDetails() != null) {
            UserDetails details = user.getUserDetails();
            TagsBundle.Builder tagsBuilder = new TagsBundle.Builder();

            if (details.getAge() != null) {
                tagsBuilder.putInt("age", details.getAge());
            }

            if (details.getUserName() != null) {
                tagsBuilder.putString("name", details.getUserName());
            }

            if (details.getLastLoginDate() != null) {
                tagsBuilder.putDate("last_login", details.getLastLoginDate());
            }

            // Build and send tags
            TagsBundle tags = tagsBuilder.build();
            if (!tags.isEmpty()) {
                pushwoosh.setTags(tags);
            }
        }
    }
}
```
</TabItem>
</Tabs>

### Tags

Tags คือคู่ของคีย์-ค่าที่กำหนดให้กับผู้ใช้หรืออุปกรณ์ ซึ่งช่วยให้สามารถแบ่งกลุ่มตามคุณลักษณะต่างๆ เช่น ความชอบหรือพฤติกรรม ทำให้สามารถส่งข้อความแบบกำหนดเป้าหมายได้

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import com.pushwoosh.Pushwoosh
import com.pushwoosh.tags.TagsBundle
import java.util.List

class UpdateUser {
    public void afterUserUpdateProfile(User user) {
        val pushwoosh = Pushwoosh.getInstance()
        val tagsBuilder = TagsBundle.Builder()

        // Set list of favorite categories
        if (user.favoriteCategories != null && user.favoriteCategories.isNotEmpty()) {
            tagsBuilder.putList("favorite_categories", user.getFavoriteCategories())
        }

        // Set payment information
        tagsBuilder.putBoolean("is_subscribed", user.isSubscribed())
        tagsBuilder.putString("payment_status", user.getPaymentStatus())
        tagsBuilder.putString("billing_address", user.getBillingAddress())

        // Build and send tags
        pushwoosh.setTags(tagsBuilder.build())
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import com.pushwoosh.Pushwoosh;
import com.pushwoosh.tags.TagsBundle;
import java.util.List;

public class UpdateUser {
    public void afterUserUpdateProfile(User user) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance();
        TagsBundle.Builder tagsBuilder = TagsBundle.Builder();

        // Set list of favorite categories
        if (user.getFavoriteCategories() != null && !user.getFavoriteCategories().isEmpty()) {
            tagsBuilder.putList("favorite_categories", user.getFavoriteCategories());
        }

        // Set payment information
        tagsBuilder.putBoolean("is_subscribed", user.isSubscribed());
        tagsBuilder.putString("payment_status", user.getPaymentStatus());
        tagsBuilder.putString("billing_address", user.getBillingAddress());

        // Build and send tags
        pushwoosh.setTags(tagsBuilder.build());
    }
}
```
</TabItem>
</Tabs>

### Events

Events คือการกระทำหรือเหตุการณ์เฉพาะของผู้ใช้ภายในแอปที่สามารถติดตามเพื่อวิเคราะห์พฤติกรรมและกระตุ้นข้อความหรือการกระทำที่สอดคล้องกัน

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import com.pushwoosh.Pushwoosh
import com.pushwoosh.inapp.InAppManager
import com.pushwoosh.tags.TagsBundle
import java.util.Date

class Registration {

    public void afterUserLogin(User user) {
        if (user.getUserName() != null && user.getLastLoginDate() != null) {
            val attributes = TagsBundle.Builder()
                .putString("name", user.getUserName())
                .putDate("last_login", user.getLastLoginDate())
                .build()
            
            InAppManager.getInstance().postEvent("login", attributes)
        }
    }

    public void afterUserPurchase(User user, Product product) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance()

        // Track purchase event
        val purchaseAttributes = TagsBundle.Builder()
            .putString("product_id", product.getId())
            .putString("product_name", product.getName())
            .putDouble("price", product.getPrice())
            .putInt("quantity", product.getQuantity())
            .build()
        
        InAppManager.getInstance().postEvent("purchase", purchaseAttributes)

        // Set user tags
        val tagsBuilder = TagsBundle.Builder()
        tagsBuilder.putDate("last_purchase_date", Date())
        val lifetimeSpend = getCurrentLifetimeSpend() + product.getPrice()
        tagsBuilder.putDouble("lifetime_spend", getCurrentLifetimeSpend())
        pushwoosh.setTags(tagsBuilder.build())
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import com.pushwoosh.Pushwoosh;
import com.pushwoosh.tags.TagsBundle;
import java.util.Date;

public class Registration {

    public void afterUserLogin(User user) {
        if (user.getUserName() != null && user.getLastLoginDate() != null) {
            TagsBundle attributes = new TagsBundle.Builder()
                .putString("name", user.getUserName())
                .putDate("last_login", user.getLastLoginDate())
                .build();

            Pushwoosh.getInstance().postEvent("login", attributes);
        }
    }

    public void afterUserPurchase(User user, Product product) {
        Pushwoosh pushwoosh = Pushwoosh.getInstance();

        // Track purchase event
        TagsBundle purchaseAttributes = new TagsBundle.Builder()
            .putString("product_id", product.getId())
            .putString("product_name", product.getName())
            .putDouble("price", product.getPrice())
            .putInt("quantity", product.getQuantity())
            .build();

        Pushwoosh.getInstance().postEvent("purchase", purchaseAttributes);

        // Set user tags
        TagsBundle.Builder tagsBuilder = new TagsBundle.Builder();
        tagsBuilder.putDate("last_purchase_date", new Date());
        double lifetimeSpend = getCurrentLifetimeSpend() + product.getPrice();
        tagsBuilder.putDouble("lifetime_spend", getCurrentLifetimeSpend());
        pushwoosh.setTags(tagsBuilder.build());
    }
}
```
</TabItem>
</Tabs>

### Rich Media

Rich media หมายถึงเนื้อหาเชิงโต้ตอบและมัลติมีเดีย เช่น รูปภาพ วิดีโอ หรือ HTML ที่ใช้ในการแจ้งเตือนและข้อความในแอปเพื่อเพิ่มการมีส่วนร่วมของผู้ใช้


เพื่อเปิดใช้งานฟีเจอร์ **Modal Rich Media** คุณต้องกำหนดค่าในไฟล์ `AndroidManifest.xml` ของแอปพลิเคชันของคุณโดยการเพิ่มรายการข้อมูลเมตาต่อไปนี้:

```xml title="AndroidManifest.xml"
<meta-data
    android:name="com.pushwoosh.rich_media_type"
    android:value="Modal" />
```

<Tabs syncKey="code-example">
<TabItem label="Kotlin">
```kotlin
import android.util.Log
import com.pushwoosh.richmedia.RichMedia
import com.pushwoosh.richmedia.RichMediaManager
import com.pushwoosh.richmedia.RichMediaPresentingDelegate
import com.pushwoosh.inapp.view.config.ModalRichmediaConfig
import com.pushwoosh.inapp.view.config.enums.*

class MainActivity : AppCompatActivity(), RichMediaPresentingDelegate {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        RichMediaManager.setDelegate(this)

        // Configure the modal rich media
        val config = ModalRichmediaConfig()
            .setViewPosition(ModalRichMediaViewPosition.BOTTOM)
            .setPresentAnimationType(ModalRichMediaPresentAnimationType.SLIDE_UP)
            .setDismissAnimationType(ModalRichMediaDismissAnimationType.SLIDE_DOWN)
            
        // Apply the configuration
        RichMediaManager.setDefaultRichMediaConfig(config)
    }
    
    override fun shouldPresent(richMedia: RichMedia): Boolean {
        Log.d("Pushwoosh", "Rich media will be presented with: ${richMedia.content}")
        return true
    }

    override fun onPresent(richMedia: RichMedia) {
        Log.d("Pushwoosh", "Rich media has been presented: ${richMedia.content}")
    }

    override fun onClose(richMedia: RichMedia) {
        Log.d("Pushwoosh", "Rich media has been closed: ${richMedia.content}")
    }

    override fun onError(richMedia: RichMedia, pushwooshException: PushwooshException) {
        Log.e("Pushwoosh", "Failed to present rich media: ${richMedia.content}. Error: ${pushwooshException.message}")
    }
}
```
</TabItem>
<TabItem label="Java">
```java
import android.util.Log;
import com.pushwoosh.richmedia.RichMedia;
import com.pushwoosh.richmedia.RichMediaManager;
import com.pushwoosh.richmedia.RichMediaPresentingDelegate;
import com.pushwoosh.inapp.view.config.ModalRichmediaConfig;
import com.pushwoosh.inapp.view.config.enums.*;

public class MainActivity extends AppCompatActivity implements RichMediaPresentingDelegate {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RichMediaManager.setDelegate(this);

        // Configure the modal rich media
        ModalRichmediaConfig config = new ModalRichmediaConfig()
            .setViewPosition(ModalRichMediaViewPosition.BOTTOM)
            .setPresentAnimationType(ModalRichMediaPresentAnimationType.SLIDE_UP)
            .setDismissAnimationType(ModalRichMediaDismissAnimationType.SLIDE_DOWN);

        // Apply the configuration
        RichMediaManager.setDefaultRichMediaConfig(config);
    }

    @Override
    public boolean shouldPresent(RichMedia richMedia) {
        Log.d("Pushwoosh", "Rich media will be presented with: " + richMedia.getContent());
        return true;
    }

    @Override
    public void onPresent(RichMedia richMedia) {
        Log.d("Pushwoosh", "Rich media has been presented: " + richMedia.getContent());
    }

    @Override
    public void onClose(RichMedia richMedia) {
        Log.d("Pushwoosh", "Rich media has been closed: " + richMedia.getContent());
    }

    @Override
    public void onError(RichMedia richMedia, PushwooshException pushwooshException) {
        Log.e("Pushwoosh", "Failed to present rich media: " + richMedia.getContent() + ". Error: " + pushwooshException.getMessage());
    }
}
```
</TabItem>
</Tabs>

## การแก้ไขปัญหา

หากคุณพบปัญหาใดๆ ในระหว่างกระบวนการผสานการทำงาน โปรดอ้างอิงถึงส่วน [การสนับสนุนและชุมชน](/th/developer/pushwoosh-sdk/support-and-community)