كيفية حذف رسالة SMS في Kotlin

أبسط طريقة لإرسال رسائل SMS من Kotlin هي استخدام واجهة برمجة تطبيقات HTTP/Rest المدمجة في Ozeki SMS Gateway. عند استخدام هذه الواجهة، ستقوم بإرسال رسائل SMS عن طريق إرسال طلب HTTP Post إلى بوابة الرسائل القصيرة. سيحتوي طلب HTTP Post على رسالة مُنسقة بتنسيق json. ستقوم بوابة الرسائل القصيرة بإرسال هذه الرسالة إلى هاتف المستلم، وسيتم إرجاع استجابة HTTP 200 OK لطلبك. (الشكل 1)

كيفية حذف رسالة SMS في Kotlin
الشكل 1 - كيفية حذف رسالة SMS في Kotlin

كود Kotlin لحذف رسالة SMS

يوضح مثال كود Kotlin للرسائل القصيرة أدناه كيف يمكنك حذف رسالة (رسائل) SMS باستخدام واجهة برمجة تطبيقات HTTP REST الخاصة بـ Ozeki SMS Gateway باستخدام مكتبة Kotlin Ozeki.Libs.Rest. هذه المكتبة مقدمة لك مجانًا، ويمكنك استخدامها وتعديلها في أي من مشاريعك.

الفيديو 1 - كيفية تحميل مثال DeleteSms.kt.zip (برنامج تعليمي بالفيديو)

MainActivity.kt
package delete.sms

import Ozeki.Libs.Rest.Configuration
import Ozeki.Libs.Rest.Folder
import Ozeki.Libs.Rest.MessageApi
import Ozeki.Libs.Rest.Message
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val folderCategories:android.widget.Spinner = findViewById(R.id.folderCategories)
        val ID:android.widget.EditText = findViewById(R.id.inputId)
        val btnSendRequest:android.widget.Button = findViewById(R.id.btnSendRequest)
        val logBox:android.widget.TextView = findViewById(R.id.logBox)
        logBox.movementMethod = ScrollingMovementMethod()

        val configuration = Configuration(
            username = "http_user",
            password = "qwe123",
            apiurl = "http://10.0.2.2:9509/api"
        )

        val api = MessageApi(configuration)

        btnSendRequest.setOnClickListener {
            if (ID.text.toString() != "") {

                val msg = Message()
                msg.ID = ID.text.toString()

                val folder: Folder

                when (folderCategories.selectedItem.toString()) {
                    "Outbox" -> folder = Folder.Outbox;
                    "Sent" -> folder = Folder.Sent;
                    "Not sent" -> folder = Folder.NotSent;
                    "Deleted" -> folder = Folder.Deleted;
                    else -> folder = Folder.Inbox
                }
                GlobalScope.launch(Dispatchers.IO) {
                    val response = api.Delete(folder, msg)
                    logBox.text = String.format("%s\n%s", logBox.text, response.toString())
                }
                ID.text.clear()
            }
        }
    }
}
	
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textId"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="36dp"
        android:text="ID:"
        android:textSize="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/inputId"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:ems="10"
        android:hint="4c24263b-dacc-48d1-b179-b7e64f08eb26"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textId" />

    <Spinner
        android:id="@+id/folderCategories"
        android:layout_width="320dp"
        android:layout_height="50dp"
        android:layout_marginTop="40dp"
        android:entries="@array/folders"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.494"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/inputId" />

    <Button
        android:id="@+id/btnSendRequest"
        android:layout_width="320dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="حذف"
        app:layout_constraintEnd_toEndOf="parent"
        android:backgroundTint="#FF3F3F"
        app:layout_constraintHorizontal_bias="0.505"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/logBox" />

    <TextView
        android:id="@+id/logBox"
        android:layout_width="320dp"
        android:layout_height="250dp"
        android:layout_marginTop="40dp"
        android:scrollbars="vertical"
        android:text="السجلات:"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/folderCategories" />
</androidx.constraintlayout.widget.ConstraintLayout>
	

كيفية استخدام مثال Kotlin للرسائل القصيرة:

يمكنك استخدام فئة MessageApi لحذف رسالة (رسائل) SMS من بوابة الرسائل القصيرة. سيتم توجيه طلبك إلى بوابة الرسائل القصيرة من جهازك عبر الإنترنت.

تنزيل DeleteSms.kt

يمكن تنزيل الكود المصدري الموضح في هذه المقالة واستخدامه وتعديله مجانًا.
تنزيل: DeleteSms.kt.zip (149 كيلوبايت)

ما الموجود في ملف DeleteSms.kt.zip؟

يحتوي ملف DeleteSms.kt.zip على مشروع مثال، والذي يتضمن مكتبة Ozeki.Libs.Rest. باستخدام هذه المكتبة يمكنك إرسال وحذف وتمييز واستقبال رسائل SMS عن طريق إنشاء MessageApi واستخدام طرق Send() وDelete() وMark() وReceive(). (الشكل 2)

مشروع مثال لحذف الرسائل النصية باستخدام Kotlin
الشكل 2 - دليل DeleteSms.kt

كيفية حذف الرسائل النصية باستخدام Kotlin (خطوات سريعة)

لحذف الرسائل النصية باستخدام Kotlin:

  1. تثبيت Ozeki SMS Gateway
  2. ربط Ozeki SMS Gateway بشبكة الهاتف المحمول
  3. إرسال رسالة نصية تجريبية من واجهة Ozeki
  4. إنشاء مستخدم HTTP API للرسائل النصية
  5. Android Studio
  6. تنزيل مشروع المثال أعلاه
  7. إنشاء الرسالة النصية عن طريق إنشاء كائن Message جديد
  8. إنشاء API لحذف رسالة نصية
  9. استخدام طريقة Delete لحذف رسالتك
  10. قراءة رسالة الاستجابة على وحدة التحكم
  11. فحص السجلات في بوابة الرسائل النصية

تثبيت Ozeki SMS Gateway وإنشاء مستخدم HTTP API

لتتمكن من حذف الرسائل النصية باستخدام Kotlin، تحتاج أولاً إلى تثبيت Ozeki SMS Gateway. يمكن تثبيت بوابة الرسائل النصية على نفس الكمبيوتر الذي تقوم فيه بتطوير كود Kotlin في Android Studio. بعد التثبيت، الخطوة التالية هي ربط Ozeki SMS Gateway بشبكة الهاتف المحمول. يمكنك إنشاء مستخدم HTTP API للرسائل النصية. قم بإنشاء مستخدم باسم مستخدم "http_user"، وكلمة مرور "qwe123" لجعل المثال يعمل دون تعديل.

بعد إعداد البيئة، يمكنك تشغيل كود Kotlin الخاص بك.

رابط HTTP API لإرسال الرسائل النصية من Kotlin

لحذف الرسائل النصية باستخدام Kotlin، سيتعين على Kotlin إرسال طلب HTTP إلى بوابة الرسائل النصية. رابط API موضح أدناه. لاحظ أنه يجب استبدال عنوان IP (127.0.0.1) بعنوان IP الخاص ببوابة الرسائل النصية. إذا كان Ozeki SMS Gateway مثبتًا على نفس الكمبيوتر الذي يعمل عليه تطبيق الرسائل النصية JavaScript، يمكن أن يكون هذا 127.0.0.1. إذا كان مثبتًا على كمبيوتر مختلف، فيجب أن يكون عنوان IP لذلك الكمبيوتر.

http://127.0.0.1:9509/api?action=rest
    

مصادقة HTTP لحذف الرسائل النصية باستخدام Kotlin

لمصادقة عميل الرسائل النصية Kotlin، تحتاج إلى إرسال اسم المستخدم وكلمة المرور في سلسلة مشفرة base64 إلى الخادم في طلب HTTP. التنسيق المستخدم هو: base64(username+":"+password). في Kotlin يمكنك استخدام الكود التالي لإجراء هذا التشفير:

var usernamePassword = "%s:%s".format(username, password)
return "Basic %s".format(Base64.getEncoder().encodeToString(usernamePassword.toByteArray()))
    

على سبيل المثال، إذا قمت بتشفير اسم المستخدم 'http_user' وكلمة المرور 'qwe123'، ستحصل على السلسلة المشفرة base64 التالية: aHR0cF91c2VyOnF3ZTEyMw==. للإرسال

رأس طلب HTTP لحذف الرسائل النصية من Kotlin

لحذف الرسالة/الرسائل النصية، تحتاج إلى تضمين الأسطر التالية كرؤوس في طلب HTTP. لاحظ أننا نضمن نوع المحتوى ورأس المصادقة.

Content-Type: application/json
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
    

طلب HTTP لاستقبال الرسائل النصية باستخدام Kotlin

لحذف الرسائل النصية، سيرسل تطبيق Kotlin الخاص بك طلب HTTP مشابه للطلب أدناه. لاحظ أن هذا الطلب يحتوي على جزء رأس HTTP وجسم HTTP. جسم HTTP هو سلسلة بيانات مشفرة JSON. يحتوي على معرفات الرسائل التي تريد حذفها.

POST /api?action=deletemsg HTTP/1.1
Connection: Keep-Alive
Content-Length: 73
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip
Authorization: Basic aHR0cF91c2VyOnF3ZTEyMw==
Host: 10.0.2.2:9509
User-Agent: okhttp/4.2.2

{
    "folder":    "inbox",
    "message_ids":    [
        "f07b71e9-6c4c-8ff1-88a5-3aa9fec74966"
    ]
}
    

استجابة HTTP التي يتلقاها مثال الرسائل النصية Kotlin

بمجرد أن تستقبل بوابة الرسائل النصية هذا الطلب، ستولد استجابة HTTP. ستتضمن استجابة HTTP رمز حالة للإشارة إلى ما إذا كان طلب إرسال الرسالة النصية ناجحًا أم لا. كما ستعود بهيكل مشفر JSON لتزويدك بتفاصيل مفيدة حول إرسال الرسالة.

HTTP/1.1 200 OK
User-Agent: OZEKI 10.3.120 (www.myozeki.com)
Content-Type: application/json; charset=utf8
Last-Modified: Fri, 18 Jun 2021 08:10:45 GMT
Server: 10/10.3.120
Transfer-Encoding: chunked

{
    "http_code": 200,
    "response_code": "SUCCESS",
    "response_msg": "",
    "data": {
      "folder": "inbox",
      "message_ids": [
        "f07b71e9-6c4c-8ff1-88a5-3aa9fec74966"
      ]
    }
}
    

كيفية حذف رسائل SMS باستخدام Kotlin باستخدام واجهة برمجة تطبيقات الرسائل القصيرة ومشروع المثال أعلاه (فيديو تعليمي)

يوضح لك هذا الفيديو كيفية تنزيل واستخدام مشروع DeleteSms.kt. بمجرد فتح مشروع المثال، قد تلاحظ وجود حزمة تسمى Ozeki.Libs.Rest. هذه هي الحزمة التي تحتوي على MessageApi وكل ما تحتاجه لحذف رسالة/رسائل SMS باستخدام Kotlin.

الفيديو 2 - كيفية حذف الرسائل القصيرة باستخدام كود Kotlin أعلاه (فيديو تعليمي)

كيفية التحقق من قبول الطلب من قبل مستخدم HTTP

بعد إرسال الرسالة القصيرة، من الجيد التحقق من بوابة الرسائل القصيرة لمعرفة ما تم استلامه. يمكنك التحقق من السجل عن طريق فتح تفاصيل مستخدم HTTP من وحدة تحكم إدارة بوابة Ozeki SMS. في نهاية الفيديو أعلاه، يمكنك رؤية كيفية التحقق مما إذا كان الطلب قد تم استلامه من قبل http_user. (الشكل 3)

مشروع Kotlin لاستقبال رسائل SMS
الشكل 3 - مشروع DeleteSms.kt في Android Studio

استخدام التطبيق على الهاتف

في الشكل 4، يمكنك رؤية كيف يبدو حذف رسالة SMS عند استخدام التطبيق على الهاتف. الصق معرف الرسالة في مربع النص 'ID' واضغط على زر 'حذف'. سيؤدي ذلك إلى حذف الرسالة المحددة. إذا تمت العملية بنجاح، سترى رسالة 'صحيح' في قسم 'السجلات'.

تطبيق Kotlin مثال لاستقبال رسائل SMS
الشكل 4 - تطبيق DeleteSms مثال قبل وبعد تنزيل الرسائل

كيفية إضافة Ozeki.Libs.Rest إلى مشروعك الخاص

يمكن تنزيل واستخدام وتعديل مكتبة Ozeki.Libs.Rest مجانًا.
تنزيل: Ozeki.Libs.Rest.kt.zip (7.66 كيلوبايت)

إذا قررت إنشاء تطبيقك الخاص باستخدام مكتبة Ozeki.Libs.Rest فقط، فهناك بعض الأشياء التي يجب تغييرها في تطبيقك الأساسي. لاستخدام مكتبة Ozeki.Libs.Rest، يجب وضعها في مجلد java الخاص بالدليل الرئيسي.
في الفيديو التالي، سأوضح لك كيفية تنزيل وإضافة مكتبة Ozeki.Libs.Rest إلى مشروعك الخاص.

الفيديو 3 - كيفية إضافة مكتبة Ozeki.Libs.Rest إلى تطبيقك الخاص (فيديو تعليمي)

التبعيات

من المهم ذكر أن مكتبة Ozeki.Libs.Rest لديها بعض التبعيات. لاستخدامها، يجب إضافة هذه التبعيات إلى Gradle Scripts.

implementation "com.squareup.okhttp3:okhttp:4.2.2"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
    

الكود 1 - قائمة التبعيات التي تحتاج إلى تضمينها.

كيفية إضافة التبعيات المطلوبة (فيديو تعليمي)

في هذا الفيديو، نقدم لك عملية إضافة التبعيات إلى مشروعك. سيبدأ الفيديو بنسخ الكود من صفحة هذا البرنامج التعليمي وسينتهي بالتبعيات في المشروع. هذه التبعيات هي أجزاء حاسمة من المشروع. بدونها، لن تعمل مكتبة Ozeki.Libs.Rest. هذا الفيديو مدته 53 ثانية فقط، ولكنه سهل الفهم والمتابعة.

الفيديو 4 - كيفية إضافة التبعيات المطلوبة (فيديو تعليمي)

الوصول إلى الإنترنت

لتمكين تطبيقك من إرسال طلب HTTP، يجب تمكين اتصال التطبيق بالإنترنت.
في الفيديو التالي، سأوضح لك كيفية تمكين الوصول إلى الإنترنت لتطبيق Kotlin الخاص بك.

<uses-permission android:name="android.permission.INTERNET" />
    

الكود 2 - لتمكين الوصول إلى الإنترنت لتطبيق Kotlin الخاص بك.

android:usesCleartextTraffic="true"
    

الكود 3 - لتمكين إرسال طلبات HTTP

كيفية إضافة اتصال الإنترنت إلى مشروعك (فيديو تعليمي)

تحتاج إلى إضافة هذين السطرين إلى ملف AndroidManifest.xml.
في الفيديو التالي، سأوضح لك أين يجب إدخال الأكواد السابقة. سيبدأ الفيديو بنسخ الكود وسيأخذك إلى اتصال الإنترنت المضاف بنجاح. هذا الفيديو دقيق وسهل المتابعة.

الفيديو 5 - كيفية السماح بالوصول إلى الإنترنت لتطبيقك (فيديو تعليمي)

أفكار أخيرة

يخبرك هذا المقال كيفية استخدام كود Kotlin المقدم لحذف رسائل SMS مع مستخدم HTTP الخاص بـ Ozeki SMS Gateway. إذا كنت تتعامل مع العديد من رسائل SMS يوميًا والعديد منها غير مرغوب فيه، فالإجراء الموضح هنا ضروري لك. التخزين المتوازن والمُحَذَّف بشكل متكرر مهم جدًا في جميع المجالات، حيث يسمح بعمل أكثر ديناميكية وكفاءة.

تواصل هذه الرحلة التعليمية على صفحة Ozekي، واختر من بين العديد من المقالات الأخرى. لنقرأ المقال بعنوان Github: Kotlin SMS API، وهو يتحدث عن أحد المستودعات التي يمكنك استخدامها بحرية.

قم بتنزيل Ozeki SMS Gateway الآن واستخدم ما تعلمته!

More information