# Pushwoosh Android SDK সম্পর্কিত প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী

* [Android পুশ টোকেন এবং HWID দেখতে কেমন?](#what-does-android-push-token-and-hwid-look-like)
* [আমি কীভাবে আমার Android ডিভাইসের পুশ টোকেন পেতে পারি?](#how-can-i-obtain-my-android-device-push-token)
* [কোন অনুমতিগুলো প্রয়োজনীয় এবং কোনগুলো ঐচ্ছিক?](#what-permissions-are-necessary-and-what-are-optional)
* [আমি কীভাবে একটি UserID সেট করব?](#how-do-i-set-a-userid)
* [Android গ্রাহকদের মোট সংখ্যা কতটা সঠিক?](#how-accurate-is-the-total-number-of-android-subscribers)
* [Android-এ পাঠানো পুশগুলিতে কি আমি HTML ট্যাগ ব্যবহার করতে পারি?](#can-i-use-html-tags-in-pushes-sent-to-android)
* [Android Lollipop (এবং পরবর্তী সংস্করণগুলিতে) নোটিফিকেশন আইকন কীভাবে সেট করবেন?](#how-to-set-a-notification-icon-in-android-lollipop-and-later-versions)
* [অন্যান্য FCM পরিষেবাগুলির সাথে Pushwoosh SDK ব্যবহার করা](#using-pushwoosh-sdk-with-other-fcm-services)
* [LeakCanary বা AppMetrica লাইব্রেরির সাথে Pushwoosh ব্যবহার করা](#using-pushwoosh-with-leakcanary-or-appmetrica-libraries)
* [একটি ডিভাইস থেকে প্রাপ্ত নোটিফিকেশন মুছে ফেলা](#deleting-particular-received-notifications-from-a-device)

### Android পুশ টোকেন এবং HWID দেখতে কেমন?

Android ডিভাইসের পুশ টোকেনগুলির দৈর্ঘ্য ভিন্ন হয় (২৫৫ অক্ষরের কম) এবং এগুলি **APA91b** দিয়ে শুরু হয়, উদাহরণস্বরূপ:

`APA91bFoi3lMMre9G3XzR1LrF4ZT82_15MsMdEICogXSLB8-MrdkRuRQFwNI5u8Dh0cI90ABD3BOKnxkEla8cGdisbDHl5cVIkZah5QUhSAxzx4Roa7b4xy9tvx9iNSYw-eXBYYd8k1XKf8Q_Qq1X9-x-U-Y79vdPq`

টোকেনগুলিতে প্রায়শই **APA91b**-এর আগে একটি কোলন-দ্বারা-বিভক্ত উপসর্গ থাকে, উদাহরণস্বরূপ: `eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...`

Pushwoosh HWID হিসাবে UUID ব্যবহার করে, অর্থাৎ ৩২টি আলফানিউমেরিক্যাল অক্ষরের এলোমেলোভাবে তৈরি স্ট্রিং: `123e4567-e89b-12d3-a456-426655440000`

### আমি কীভাবে আমার Android ডিভাইসের পুশ টোকেন পেতে পারি?

আপনি কনসোল লগে আপনার Android ডিভাইসের পুশ টোকেন পেতে পারেন। [Android Studio](https://developer.android.com/studio)-তে logcat টুল ব্যবহার করুন।

**monitor.bat** ফাইলটি `%USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat` পাথে খুলুন, আপনার ডিভাইসটি পিসিতে সংযুক্ত করুন এবং Android সেটিংসে USB ডিবাগিং অনুমতি দিন। আপনার অ্যাপ্লিকেশনটি ডিভাইসে চালান। `/registerDevice` খুঁজুন, আপনার ডিভাইসের জন্য পুশ টোকেনটি খুঁজে বের করুন যা পরে Test Devices-এ ব্যবহার করতে পারবেন।

<img src="/android-push-notifications-android-faq-1.webp" alt="Android Studio-তে পুশ টোকেন রেজিস্ট্রেশন তথ্য সহ logcat আউটপুট দেখানো স্ক্রিনশট"/>

### কোন অনুমতিগুলো প্রয়োজনীয় এবং কোনগুলো ঐচ্ছিক?

একটি Android ডিভাইসে ইনস্টল করার সময়, অ্যাপ্লিকেশনটি Pushwoosh SDK-এর সাথে সম্পর্কিত নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করবে:

```java
<!-- FCM ফায়ারবেস পরিষেবাগুলির সাথে সংযোগ করে। -->
 <uses-permission android:name="android.permission.INTERNET"/>

<!-- একটি বার্তা প্রাপ্ত হলে প্রসেসরকে স্লিপ মোডে যেতে বাধা দেয়। -->
 <uses-permission android:name="android.permission.WAKE_LOCK"/>

 <!-- এই অনুমতিটি ডিভাইস নেটওয়ার্কে অ্যাক্সেস করতে পারে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। -->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- এই অ্যাপটির ডেটা বার্তা নিবন্ধন এবং গ্রহণ করার অনুমতি রয়েছে। -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
```

আমাদের SDK ছবি, ডিভাইসের পরিচিতি ইত্যাদি অ্যাক্সেস করার জন্য অনুমতি চায় না।

### আমি কীভাবে একটি UserID সেট করব?

আপনি একটি [ব্যবহারকারী শনাক্তকারী (UserID)](/bn/developer/first-steps/collecting-user-ids/) সেট করতে পারেন, যা একটি Facebook ID, ব্যবহারকারীর নাম, ইমেল বা অন্য কোনো অনন্য ব্যবহারকারী ID হতে পারে। এটি আপনাকে একই ব্যবহারকারীর সাথে যুক্ত একাধিক ডিভাইস জুড়ে ডেটা এবং ইভেন্ট মেলাতে দেয়। UserID সেট করতে, **setUserId** মেথডটি কল করুন।

**উদাহরণ**

```
Pushwoosh.getInstance().setUserId("testUser");
```

### Android গ্রাহকদের মোট সংখ্যা কতটা সঠিক?

Pushwoosh FCM থেকে "NotRegistered" প্রতিক্রিয়া পাওয়ার পরে ডাটাবেস থেকে আনসাবস্ক্রাইব করা Android ডিভাইসগুলি পরিষ্কার করে, যা একটি নির্দিষ্ট ডিভাইসে পৌঁছানোর দ্বিতীয় প্রচেষ্টার পরে ফেরত আসতে পারে। এর মানে হল যে আপনাকে একটি আনসাবস্ক্রাইব করা ডিভাইসে ২টি পুশ পাঠাতে হবে যাতে এটি ডাটাবেস থেকে সরানো হয়।

নিম্নলিখিতটি [FCM ডকুমেন্টেশনে](https://firebase.google.com/docs/cloud-messaging/) বর্ণিত সবচেয়ে সাধারণ পরিস্থিতি:

1. আপনার গ্রাহক অ্যাপটি আনইনস্টল করে।
2. Pushwoosh FCM সার্ভারে একটি বার্তা পাঠায়।
3. FCM সার্ভার আপনার ব্যবহারকারীর ডিভাইসে বার্তাটি পাঠায়।
4. ডিভাইসের FCM ক্লায়েন্ট বার্তাটি গ্রহণ করে এবং সনাক্ত করে যে আপনার অ্যাপ্লিকেশনটি আনইনস্টল করা হয়েছে; সনাক্তকরণের বিবরণ অ্যাপটি যে প্ল্যাটফর্মে চলছে তার উপর নির্ভর করে।
5. ডিভাইসের FCM ক্লায়েন্ট FCM সার্ভারকে জানায় যে অ্যাপটি আনইনস্টল করা হয়েছে।
6. FCM সার্ভার রেজিস্ট্রেশন ID-টি মুছে ফেলার জন্য চিহ্নিত করে।
7. Pushwoosh FCM-কে আরেকটি বার্তা পাঠায়।
8. FCM একটি NotRegistered বার্তা ফেরত দেয়।
9. Pushwoosh আপনার ব্যবহারকারী বেস থেকে পুশ টোকেনটি সরিয়ে দেয়।

FCM থেকে রেজিস্ট্রেশন ID সম্পূর্ণরূপে মুছে ফেলতে কিছুটা সময় লাগতে পারে। তাই উপরের ৭ নং ধাপে পাঠানো একটি বার্তা প্রতিক্রিয়া হিসাবে একটি বৈধ বার্তা ID পেতে পারে, যদিও বার্তাটি ক্লায়েন্ট অ্যাপে বিতরণ করা হবে না।

### Android-এ পাঠানো পুশগুলিতে কি আমি HTML ট্যাগ ব্যবহার করতে পারি?

হ্যাঁ, Android-এ আপনি একটি পুশের চেহারা পরিবর্তন করার জন্য নিম্নলিখিত HTML ট্যাগগুলি ব্যবহার করতে পারেন:

```txt
<span style="color: green;"><b><i><span style="text-decoration: underline;">Hello world!
Hello hi hey</span></i></b></span>
```

এই HTML ট্যাগগুলি **Message** ইনপুট ফিল্ডে রাখুন, এবং API অনুরোধেও সেগুলি ব্যবহার করুন। কিছু Android ডিভাইস এই HTML ট্যাগগুলি সঠিকভাবে প্রক্রিয়া করতে ব্যর্থ হতে পারে, কিন্তু বেশিরভাগ ডিভাইস ফর্ম্যাটিং সঠিকভাবে প্রদর্শন করে।

### Android Lollipop (এবং পরবর্তী সংস্করণগুলিতে) নোটিফিকেশন আইকন কীভাবে সেট করবেন?

Android Lollipop-এ আইকনগুলি শুধুমাত্র সাদা রঙের জন্য পরিবর্তন করা হয়েছিল। অতএব, আপনি যদি আপনার **AndroidManifest.xml** ফাইলে **targetSdkVersion >= 21** নির্বাচন করেন, তাহলে Android শুধুমাত্র আইকনের আলফা-চ্যানেল ব্যবহার করবে।\
এই আচরণ সম্পর্কে আরও জানতে [Android ডকুমেন্টেশন](https://developer.android.com/docs) দেখুন।

সিস্টেম অ্যাকশন আইকন এবং প্রধান নোটিফিকেশন আইকনের সমস্ত নন-আলফা চ্যানেল উপেক্ষা করে। ধরে নিন এই আইকনগুলি শুধুমাত্র আলফা-চ্যানেলযুক্ত হবে। সিস্টেম নোটিফিকেশন আইকনগুলি সাদা রঙে এবং অ্যাকশন আইকনগুলি গাঢ় ধূসর রঙে আঁকে। _এটি Pushwoosh SDK-এর নিয়ন্ত্রণের বাইরে_।

**১.** [Android নির্দেশিকা](https://material.io/design/platform-guidance/android-notifications.html#style) অনুযায়ী নোটিফিকেশন আইকন তৈরি করুন। [ডকুমেন্টেশন](https://developer.android.com/about/versions/lollipop/android-5.0-changes) অনুযায়ী, সিস্টেম সমস্ত রঙ উপেক্ষা করবে।

**২.** আইকনটির নাম দিন `pw_notification.png` এবং এটি **res/drawable** ফোল্ডারে রাখুন। Pushwoosh SDK এই আইকনটি নোটিফিকেশনের জন্য ডিফল্ট হিসাবে ব্যবহার করবে।

**৩.** বিকল্পভাবে, আপনি Remote API ব্যবহার করতে পারেন এবং `"android_icon"` প্যারামিটারের মান আইকন ইমেজে (ফাইল এক্সটেনশন ছাড়া) সেট করতে পারেন।

### অন্যান্য FCM পরিষেবাগুলির সাথে Pushwoosh SDK ব্যবহার করা

আপনি পুশ মেসেজিংয়ের জন্য FCM ব্যবহার করে এমন অন্যান্য SDK-এর পাশাপাশি Pushwoosh ব্যবহার করতে পারেন। এটি করার জন্য, পরিষেবাগুলির মধ্যে ইভেন্টগুলি বিতরণ করার জন্য একটি রাউটার পরিষেবা তৈরি করুন। প্রথমে, প্রধান Pushwoosh মডিউলের পাশাপাশি **pushwoosh-firebase** নির্ভরতা যোগ করুন:

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

রাউটিং ক্লাস তৈরি করুন:

<Tabs>
<TabItem label="FirebaseMessagingRouterService.kt">
```kotlin
import com.pushwoosh.firebase.PushwooshFcmHelper;

class FirebaseMessagingRouterService : FirebaseMessagingService() {

    override fun onNewToken(token: String?) {
        super.onNewToken(token)
        PushwooshFcmHelper.onTokenRefresh(token)
        sendTokenToAnotherService(token)
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) {
           //এটি একটি Pushwoosh পুশ, SDK এটি স্বয়ংক্রিয়ভাবে পরিচালনা করবে
            PushwooshFcmHelper.onMessageReceived(this, remoteMessage)
        } else {
            //এটি একটি Pushwoosh পুশ নয়, আপনাকে এটি নিজে পরিচালনা করতে হবে
            dispatchNonPushwooshMessage(remoteMessage);
        }
    }

    private fun dispatchNonPushwooshMessage(remoteMessage: RemoteMessage) {
       // এখানে আপনার পুশ হ্যান্ডলিং লজিক প্রয়োগ করুন
   }
}
```
</TabItem>

<TabItem label="FirebaseMessagingRouterService.java">
```java
import com.pushwoosh.firebase.PushwooshFcmHelper;

public class FirebaseMessagingRouterService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        PushwooshFcmHelper.onTokenRefresh(token);
        sendTokenToAnotherService(token);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) {
            //এটি একটি Pushwoosh পুশ, SDK এটি স্বয়ংক্রিয়ভাবে পরিচালনা করবে
            PushwooshFcmHelper.onMessageReceived(this, remoteMessage);
        } else {
            //এটি একটি Pushwoosh পুশ নয়, আপনাকে এটি নিজে পরিচালনা করতে হবে
            dispatchNonPushwooshMessage(remoteMessage);
        }
    }

    private void dispatchNonPushwooshMessage(RemoteMessage remoteMessage) {
        // এখানে আপনার পুশ হ্যান্ডলিং লজিক প্রয়োগ করুন
    }
}
```
</TabItem>
</Tabs>

আপনার AndroidManifest.xml-এ রাউটারগুলি নিবন্ধন করুন:

```txt title="AndroidManifest.xml"
<service
    android:name=".FirebaseMessagingRouterService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
```

### LeakCanary বা AppMetrica লাইব্রেরির সাথে Pushwoosh ব্যবহার করা

যখন আপনি LeakCanary, AppMetrica বা অন্য কোনো অ্যানালিটিক্স টুল সংহত করেন, তখন এই লাইব্রেরিগুলি একটি নতুন প্রক্রিয়া শুরু করে, যা অ্যাপের একটি নতুন ইনস্ট্যান্স তৈরি করে। যেহেতু আপনি অন্য প্রক্রিয়ায় পুশ নোটিফিকেশন শুনতে পারেন না, এর ফলে `java.lang.NullPointerException` থ্রো হয়।

আপনি যদি `Application.onCreate()`-এর ভিতরে `registerForPushNotifications` কল করেন, তাহলে আপনার পরীক্ষা করা উচিত যে আপনি অ্যাপ্লিকেশনটির প্রধান প্রক্রিয়ায় আছেন কিনা। এই পরীক্ষাটি করার জন্য নিম্নলিখিত কোডটি ব্যবহার করুন:

```java
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
if (runningAppProcesses != null && runningAppProcesses.size() != 0) {
    for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {
        boolean isCurrentProcess = runningAppProcessInfo.pid == android.os.Process.myPid();
        boolean isMainProcessName = getPackageName().equals(runningAppProcessInfo.processName);
        if (isCurrentProcess && isMainProcessName) {

            Pushwoosh.getInstance().registerForPushNotifications(...);
            break;
        }
    }
}
```

### স্থানীয়ভাবে একটি ডিভাইস থেকে নির্দিষ্ট প্রাপ্ত নোটিফিকেশন মুছে ফেলা

আপনি যদি আপনার অ্যাপ্লিকেশনের ভিতরে একটি নির্দিষ্ট ক্রিয়া সম্পাদন করার সময় একটি অপ্রাসঙ্গিক পুশ সরাতে চান, তাহলে আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:

```java title="MainActivity.java"
public class MainActivity extends AppCompatActivity {

	List<NotificationCreatedEvent> savedPushes = new ArrayList<>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Pushwoosh.getInstance().registerForPushNotifications();

		PushwooshNotificationSettings.setMultiNotificationMode(true);

		findViewById(R.id.clear_button).setOnClickListener( v -> {
			cancelPushes();
		});

		EventBus.subscribe(NotificationCreatedEvent.class, event -> {
			try {
				if (event.getMessage().getCustomData() == null)
					return;

				//শুধুমাত্র একটি নির্দিষ্ট ফ্ল্যাগ সহ পুশ বাতিল করুন
				if (new JSONObject(event.getMessage().getCustomData()).getBoolean("cancel")) {
					savedPushes.add(event);
				}
			} catch (JSONException e) {
			}
		});
	}
	private void cancelPushes() {
		NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

		if (manager == null) {
			return;
		}

		for (NotificationCreatedEvent event : savedPushes) {
			manager.cancel(event.getMessageTag(), event.getMessageId());
		}
	}
}
```

## আমাদের সাথে আপনার মতামত শেয়ার করুন

আপনার মতামত আমাদের একটি উন্নত অভিজ্ঞতা তৈরি করতে সাহায্য করে। SDK ইন্টিগ্রেশন প্রক্রিয়ার সময় যদি আপনি কোনো অসুবিধার সম্মুখীন হন, তাহলে [এই ফর্মের মাধ্যমে](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) আমাদের সাথে আপনার চিন্তাভাবনা শেয়ার করুন।