דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
מתמחים טופ
  1. דף הבית
  2. אנדרואיד - כללי
  3. עזרה הדדית - אנדרואיד
  4. בקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים

בקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים

מתוזמן נעוץ נעול הועבר עזרה הדדית - אנדרואיד
18 פוסטים 6 כותבים 147 צפיות 5 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • למה באתיל מנותק
    למה באתיל מנותק
    למה באתי
    מדריכים
    כתב נערך לאחרונה על ידי למה באתי
    #1

    זה דיי דחוף.
    וזה ממש חשוב .
    זה להעתיק מai קוד עם המבנה תיקיות הזה:

    DNSBlocker/
    └── app/
       └── src/
           └── main/
               ├── AndroidManifest.xml
               ├── java/com/example/dnsblocker/
               │   ├── MainActivity.kt
               │   ├── DnsVpnService.kt
               │   └── DNSHandler.kt
               └── res/
                   ├── layout/
                   │   └── activity_main.xml
                   └── values/
                       └── strings.xml
    

    לקמפל ולשלוח לי apk
    עבודה דיי פשוטה למי שמבין בזה ומשעמם לו בחופש.
    פשוט אני רק עם אנדרואיד ולא ליד מחשב כרגע אז אני לא יכול לקמפל.

    אשמח אם מישהו שיש לו זמן שיכתוב כאן אני ישלח לו...

    אלא אם יש דרך לקמפל את זה באנדרואיד

    Y תגובה 1 תגובה אחרונה
    0
    • למה באתיל למה באתי

      זה דיי דחוף.
      וזה ממש חשוב .
      זה להעתיק מai קוד עם המבנה תיקיות הזה:

      DNSBlocker/
      └── app/
         └── src/
             └── main/
                 ├── AndroidManifest.xml
                 ├── java/com/example/dnsblocker/
                 │   ├── MainActivity.kt
                 │   ├── DnsVpnService.kt
                 │   └── DNSHandler.kt
                 └── res/
                     ├── layout/
                     │   └── activity_main.xml
                     └── values/
                         └── strings.xml
      

      לקמפל ולשלוח לי apk
      עבודה דיי פשוטה למי שמבין בזה ומשעמם לו בחופש.
      פשוט אני רק עם אנדרואיד ולא ליד מחשב כרגע אז אני לא יכול לקמפל.

      אשמח אם מישהו שיש לו זמן שיכתוב כאן אני ישלח לו...

      אלא אם יש דרך לקמפל את זה באנדרואיד

      Y מנותק
      Y מנותק
      YOLEVI
      כתב נערך לאחרונה על ידי
      #2

      @למה-באתי שלח קוד מקור מלא כולל כל הספריות כי אני עם נטפרי

      למה באתיל תגובה 1 תגובה אחרונה
      0
      • Y YOLEVI

        @למה-באתי שלח קוד מקור מלא כולל כל הספריות כי אני עם נטפרי

        למה באתיל מנותק
        למה באתיל מנותק
        למה באתי
        מדריכים
        כתב נערך לאחרונה על ידי
        #3

        @YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

        @למה-באתי שלח קוד מקור מלא כולל כל הספריות כי אני עם נטפרי

        אין קוד מקור . יש קודים פשוט.

        למה באתיל Y 2 תגובות תגובה אחרונה
        0
        • למה באתיל למה באתי

          @YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

          @למה-באתי שלח קוד מקור מלא כולל כל הספריות כי אני עם נטפרי

          אין קוד מקור . יש קודים פשוט.

          למה באתיל מנותק
          למה באתיל מנותק
          למה באתי
          מדריכים
          כתב נערך לאחרונה על ידי
          #4
          פוסט זה נמחק!
          תגובה 1 תגובה אחרונה
          0
          • למה באתיל מנותק
            למה באתיל מנותק
            למה באתי
            מדריכים
            כתב נערך לאחרונה על ידי
            #5

            הבנתי אותך עכשיו — אתה רוצה פרויקט Android מלא ומוכן להעתקה ישירות ל־Android Studio, עם שירות VPN שמשלב DNS פנימי שמבצע סינון לפי רשימת חסימה, כולל רשימת דומיינים בדוגמה, ממשק משתמש להפעלה/כיבוי עם סיסמה.


            אני נותן לך כאן את כל הקבצים המרכזיים בפרויקט מלא, מסודרים לפי מיקום, עם הקוד המלא של כל קובץ. תוכל להעתיק ולהדביק בכל קובץ בפרויקט חדש, ולבנות מיד.


            מבנה התיקיות

            DNSBlocker/
            └── app/
            └── src/
            └── main/
            ├── AndroidManifest.xml
            ├── java/com/example/dnsblocker/
            │ ├── MainActivity.kt
            │ ├── DnsVpnService.kt
            │ └── DNSHandler.kt
            └── res/
            ├── layout/
            │ └── activity_main.xml
            └── values/
            └── strings.xml


            1. settings.gradle

            rootProject.name = "DNSBlocker"
            include(":app")


            1. build.gradle (שורש)

            buildscript {
            repositories {
            google()
            mavenCentral()
            }
            dependencies {
            classpath 'com.android.tools.build:gradle:8.0.2'
            }
            }

            allprojects {
            repositories {
            google()
            mavenCentral()
            }
            }


            1. app/build.gradle

            plugins {
            id 'com.android.application'
            id 'org.jetbrains.kotlin.android'
            }

            android {
            namespace 'com.example.dnsblocker'
            compileSdk 34

            defaultConfig {
                applicationId "com.example.dnsblocker"
                minSdk 26
                targetSdk 34
                versionCode 1
                versionName "1.0"
            }
            
            buildTypes {
                release {
                    minifyEnabled false
                }
            }
            kotlinOptions {
                jvmTarget = "17"
            }
            

            }

            dependencies {
            implementation "androidx.core:core-ktx:1.12.0"
            implementation "androidx.appcompat:appcompat:1.7.0"
            implementation "com.google.android.material:material:1.9.0"

            implementation 'dnsjava:dnsjava:3.5.2'
            

            }


            1. AndroidManifest.xml (app/src/main/)

            <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.dnsblocker">

            <uses-permission android:name="android.permission.INTERNET" />
            
            <application
                android:allowBackup="false"
                android:label="@string/app_name"
                android:theme="@style/Theme.Material3.DayNight.NoActionBar">
            
                <activity android:name=".MainActivity"
                    android:exported="true">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN"/>
                        <category android:name="android.intent.category.LAUNCHER"/>
                    </intent-filter>
                </activity>
            
                <service
                    android:name=".DnsVpnService"
                    android:permission="android.permission.BIND_VPN_SERVICE"
                    android:exported="true" />
            </application>
            

            </manifest>


            1. res/layout/activity_main.xml

            <?xml version="1.0" encoding="utf-8"?>
            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical"
            android:padding="24dp">

            <TextView
                android:id="@+id/statusText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="חסימת DNS פעילה"
                android:textSize="24sp"
                android:paddingBottom="20dp"
                android:textAlignment="center" />
            
            <Button
                android:id="@+id/toggleButton"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:text="כבה חסימה" />
            

            </LinearLayout>


            1. res/values/strings.xml

            <resources>
            <string name="app_name">חסימת DNS</string>
            </resources>


            1. MainActivity.kt (app/src/main/java/com/example/dnsblocker/)

            package com.example.dnsblocker

            import android.app.AlertDialog
            import android.content.Intent
            import android.os.Bundle
            import android.widget.Button
            import android.widget.TextView
            import androidx.appcompat.app.AppCompatActivity

            class MainActivity : AppCompatActivity() {

            private val vpnServiceIntent by lazy { Intent(this, DnsVpnService::class.java) }
            private lateinit var toggleBtn: Button
            private lateinit var statusText: TextView
            
            private var vpnRunning = false
            
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
                setContentView(R.layout.activity_main)
            
                toggleBtn = findViewById(R.id.toggleButton)
                statusText = findViewById(R.id.statusText)
            
                toggleBtn.setOnClickListener {
                    if (vpnRunning) {
                        askPasswordAndStop()
                    } else {
                        startVpn()
                    }
                }
            
                startVpn() // הפעלה אוטומטית עם פתיחת האפליקציה
            }
            
            private fun startVpn() {
                startService(vpnServiceIntent)
                vpnRunning = true
                toggleBtn.text = "כבה חסימה"
                statusText.text = "חסימת DNS פעילה"
            }
            
            private fun stopVpn() {
                stopService(vpnServiceIntent)
                vpnRunning = false
                toggleBtn.text = "הפעל חסימה"
                statusText.text = "חסימת DNS מושבתת"
            }
            
            private fun askPasswordAndStop() {
                val input = android.widget.EditText(this).apply {
                    inputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD
                }
            
                AlertDialog.Builder(this)
                    .setTitle("הזן סיסמה לביטול חסימה")
                    .setView(input)
                    .setPositiveButton("אישור") { dialog, _ ->
                        val pass = input.text.toString()
                        if (pass == "1234") {  // שנה כאן את הסיסמה לפי רצונך
                            stopVpn()
                        } else {
                            android.widget.Toast.makeText(this, "סיסמה שגויה", android.widget.Toast.LENGTH_SHORT).show()
                        }
                        dialog.dismiss()
                    }
                    .setNegativeButton("ביטול") { dialog, _ -> dialog.dismiss() }
                    .show()
            }
            

            }


            1. DNSHandler.kt (app/src/main/java/com/example/dnsblocker/)

            package com.example.dnsblocker

            import org.xbill.DNS.*
            import java.net.DatagramPacket
            import java.net.DatagramSocket
            import kotlin.concurrent.thread

            class DNSHandler(
            private val blockedDomains: Set<String>,
            private val listenPort: Int = 5353
            ) {

            private var socket: DatagramSocket? = null
            private var running = false
            
            fun start() {
                running = true
                socket = DatagramSocket(listenPort)
                thread(start = true) {
                    val buffer = ByteArray(512)
                    while (running) {
                        try {
                            val packet = DatagramPacket(buffer, buffer.size)
                            socket?.receive(packet)
                            thread {
                                handlePacket(packet)
                            }
                        } catch (e: Exception) {
                            e.printStackTrace()
                        }
                    }
                    socket?.close()
                }
            }
            
            fun stop() {
                running = false
                socket?.close()
            }
            
            private fun handlePacket(packet: DatagramPacket) {
                try {
                    val request = Message.parse(packet.data)
                    val query = request.question
                    val queriedDomain = query.name.toString(true).lowercase()
            
                    val response = Message(request.id)
                    response.header.rcode = Rcode.NOERROR
                    response.addRecord(query, Section.QUESTION)
                    response.header.qr = true // תשובה
            
                    if (isBlocked(queriedDomain)) {
                        // החזרת NXDOMAIN לאתרים חסומים
                        response.header.rcode = Rcode.NXDOMAIN
                    } else {
                        // העברה לשרת DNS חיצוני (לדוגמה 8.8.8.8)
                        val forwardResponse = forwardQuery(request)
                        if (forwardResponse != null) {
                            for (section in 0..3) {
                                forwardResponse.getSectionArray(section).forEach {
                                    response.addRecord(it, section)
                                }
                            }
                        } else {
                            response.header.rcode = Rcode.SERVFAIL
                        }
                    }
            
                    val responseData = response.toWire()
                    val responsePacket = DatagramPacket(
                        responseData,
                        responseData.size,
                        packet.address,
                        packet.port
                    )
                    socket?.send(responsePacket)
            
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
            
            private fun isBlocked(domain: String): Boolean {
                return blockedDomains.any { domain.endsWith(it) }
            }
            
            private fun forwardQuery(request: Message): Message? {
                return try {
                    val resolver = SimpleResolver("8.8.8.8")
                    resolver.timeout = 2
                    resolver.send(request)
                } catch (e: Exception) {
                    null
                }
            }
            

            }


            1. DnsVpnService.kt (app/src/main/java/com/example/dnsblocker/)

            package com.example.dnsblocker

            import android.net.VpnService
            import android.content.Intent
            import android.os.ParcelFileDescriptor
            import kotlin.concurrent.thread

            class DnsVpnService : VpnService() {

            private var vpnInterface: ParcelFileDescriptor? = null
            private var dnsHandler: DNSHandler? = null
            
            // דוגמת רשימת חסימה - הוסף את הדומיינים שברצונך לחסום כאן
            private val blockedDomains = setOf(
                "badpornsite.com",
                "adultsite.net",
                "xxxexample.org",
                "exampleporn.com"
            )
            
            override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
                setupVpn()
                startDnsServer()
                return START_STICKY
            }
            
            private fun setupVpn() {
                val builder = Builder()
                builder.addAddress("10.0.0.2", 32)
                builder.addRoute("0.0.0.0", 0)
                builder.addDnsServer("127.0.0.1") // DNS פנימי מקומי
                builder.setSession("חסימת DNS")
                vpnInterface?.close()
                vpnInterface = builder.establish()
            }
            
            private fun startDnsServer() {
                dnsHandler?.stop()
                dnsHandler = DNSHandler(blockedDomains)
                dnsHandler?.start()
            }
            
            override fun onDestroy() {
                dnsHandler?.stop()
                vpnInterface?.close()
                super.onDestroy()
            }
            
            override fun onBind(intent: Intent?) = null
            

            }


            סיכום

            הפרויקט כולל שירות VPN שפונה ל־DNS פנימי שמפעיל DNSHandler עם רשימת חסימה.

            DNSHandler מקבל בקשות DNS, בודק אם הדומיין חסום, מחזיר NXDOM
            בממשק המשתמש אפשר להפעיל ולכבות את החסימה עם סיסמה.

            זה בסדר?

            אריזה לחבילת APK חתומה

            רק תגיד!

            י תגובה 1 תגובה אחרונה
            0
            • למה באתיל למה באתי

              @YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

              @למה-באתי שלח קוד מקור מלא כולל כל הספריות כי אני עם נטפרי

              אין קוד מקור . יש קודים פשוט.

              Y מנותק
              Y מנותק
              YOLEVI
              כתב נערך לאחרונה על ידי
              #6

              @למה-באתי אתה יכול פשוט לארוז לקובץ זיפ בעצמך?
              פשוט תיצור את כל הקבצים והתקיות לפי הסדר הנכון ותעלה את הזיפ,

              קח בחשבון שלא הייתי בונה על זה שזה לא יהיה מלא שגיאות במיוחד שזה קוד ראשוני איך שאני מבין

              למה באתיל תגובה 1 תגובה אחרונה
              0
              • Y YOLEVI

                @למה-באתי אתה יכול פשוט לארוז לקובץ זיפ בעצמך?
                פשוט תיצור את כל הקבצים והתקיות לפי הסדר הנכון ותעלה את הזיפ,

                קח בחשבון שלא הייתי בונה על זה שזה לא יהיה מלא שגיאות במיוחד שזה קוד ראשוני איך שאני מבין

                למה באתיל מנותק
                למה באתיל מנותק
                למה באתי
                מדריכים
                כתב נערך לאחרונה על ידי למה באתי
                #7

                @YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                @למה-באתי אתה יכול פשוט לארוז לקובץ זיפ בעצמך?
                פשוט תיצור את כל הקבצים והתקיות לפי הסדר הנכון ותעלה את הזיפ,

                קח בחשבון שלא הייתי בונה על זה שזה לא יהיה מלא שגיאות במיוחד שזה קוד ראשוני איך שאני מבין

                איך אני יוצר ? אין לי אנדרואיד סטודיו בזמין

                Y תגובה 1 תגובה אחרונה
                0
                • ש מנותק
                  ש מנותק
                  שלמה רביב
                  כתב נערך לאחרונה על ידי
                  #8

                  @למה-באתי אפשר לשאול מה זה?

                  למה באתיל תגובה 1 תגובה אחרונה
                  0
                  • ש שלמה רביב

                    @למה-באתי אפשר לשאול מה זה?

                    למה באתיל מנותק
                    למה באתיל מנותק
                    למה באתי
                    מדריכים
                    כתב נערך לאחרונה על ידי
                    #9

                    @שלמה-רביב כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                    @למה-באתי אפשר לשאול מה זה?

                    לא הכל חייב לדעת.
                    אם לא כתבתי סימן שלא צריכים לדעת...

                    תגובה 1 תגובה אחרונה
                    0
                    • מישהו12מ מחובר
                      מישהו12מ מחובר
                      מישהו12
                      מדריכים
                      כתב נערך לאחרונה על ידי מישהו12
                      #10

                      תבקש מGPT ליצור לך את זה בZIP מוכן לאנדרואיד סטודיו כולל הכל

                      הבלוג שלי
                      https://aiv-dev.com/he-IL/

                      למה באתיל תגובה 1 תגובה אחרונה
                      0
                      • מישהו12מ מישהו12

                        תבקש מGPT ליצור לך את זה בZIP מוכן לאנדרואיד סטודיו כולל הכל

                        למה באתיל מנותק
                        למה באתיל מנותק
                        למה באתי
                        מדריכים
                        כתב נערך לאחרונה על ידי למה באתי
                        #11

                        @מישהו12 כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                        תבקש מGPT ליצור לך את זה בZIP מוכן לאנדרואיד סטודיו כולל הכל

                        לוקח מלאאא זמן
                        12 שעות.

                        מישהו12מ תגובה 1 תגובה אחרונה
                        0
                        • למה באתיל למה באתי

                          @מישהו12 כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                          תבקש מGPT ליצור לך את זה בZIP מוכן לאנדרואיד סטודיו כולל הכל

                          לוקח מלאאא זמן
                          12 שעות.

                          מישהו12מ מחובר
                          מישהו12מ מחובר
                          מישהו12
                          מדריכים
                          כתב נערך לאחרונה על ידי
                          #12

                          @למה-באתי מה???????????????????
                          לי הוא עשה דברים כאלו בדקות.

                          הבלוג שלי
                          https://aiv-dev.com/he-IL/

                          למה באתיל תגובה 1 תגובה אחרונה
                          0
                          • מישהו12מ מישהו12

                            @למה-באתי מה???????????????????
                            לי הוא עשה דברים כאלו בדקות.

                            למה באתיל מנותק
                            למה באתיל מנותק
                            למה באתי
                            מדריכים
                            כתב נערך לאחרונה על ידי
                            #13

                            @מישהו12 כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                            @למה-באתי מה???????????????????
                            לי הוא עשה דברים כאלו בדקות.

                            Screenshot_20250728-223850.png

                            מישהו12מ תגובה 1 תגובה אחרונה
                            0
                            • למה באתיל למה באתי

                              @מישהו12 כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                              @למה-באתי מה???????????????????
                              לי הוא עשה דברים כאלו בדקות.

                              Screenshot_20250728-223850.png

                              מישהו12מ מחובר
                              מישהו12מ מחובר
                              מישהו12
                              מדריכים
                              כתב נערך לאחרונה על ידי
                              #14

                              @למה-באתי תבקש ממנו שידחוס לזיפ את הקוד, זה הכול.

                              הבלוג שלי
                              https://aiv-dev.com/he-IL/

                              תגובה 1 תגובה אחרונה
                              1
                              • למה באתיל למה באתי

                                @YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                                @למה-באתי אתה יכול פשוט לארוז לקובץ זיפ בעצמך?
                                פשוט תיצור את כל הקבצים והתקיות לפי הסדר הנכון ותעלה את הזיפ,

                                קח בחשבון שלא הייתי בונה על זה שזה לא יהיה מלא שגיאות במיוחד שזה קוד ראשוני איך שאני מבין

                                איך אני יוצר ? אין לי אנדרואיד סטודיו בזמין

                                Y מנותק
                                Y מנותק
                                YOLEVI
                                כתב נערך לאחרונה על ידי
                                #15

                                @למה-באתי אתה כותב את הקודים בקבצים עם עורך טקסט, הכי פשוט בעולם

                                תגובה 1 תגובה אחרונה
                                0
                                • למה באתיל למה באתי

                                  הבנתי אותך עכשיו — אתה רוצה פרויקט Android מלא ומוכן להעתקה ישירות ל־Android Studio, עם שירות VPN שמשלב DNS פנימי שמבצע סינון לפי רשימת חסימה, כולל רשימת דומיינים בדוגמה, ממשק משתמש להפעלה/כיבוי עם סיסמה.


                                  אני נותן לך כאן את כל הקבצים המרכזיים בפרויקט מלא, מסודרים לפי מיקום, עם הקוד המלא של כל קובץ. תוכל להעתיק ולהדביק בכל קובץ בפרויקט חדש, ולבנות מיד.


                                  מבנה התיקיות

                                  DNSBlocker/
                                  └── app/
                                  └── src/
                                  └── main/
                                  ├── AndroidManifest.xml
                                  ├── java/com/example/dnsblocker/
                                  │ ├── MainActivity.kt
                                  │ ├── DnsVpnService.kt
                                  │ └── DNSHandler.kt
                                  └── res/
                                  ├── layout/
                                  │ └── activity_main.xml
                                  └── values/
                                  └── strings.xml


                                  1. settings.gradle

                                  rootProject.name = "DNSBlocker"
                                  include(":app")


                                  1. build.gradle (שורש)

                                  buildscript {
                                  repositories {
                                  google()
                                  mavenCentral()
                                  }
                                  dependencies {
                                  classpath 'com.android.tools.build:gradle:8.0.2'
                                  }
                                  }

                                  allprojects {
                                  repositories {
                                  google()
                                  mavenCentral()
                                  }
                                  }


                                  1. app/build.gradle

                                  plugins {
                                  id 'com.android.application'
                                  id 'org.jetbrains.kotlin.android'
                                  }

                                  android {
                                  namespace 'com.example.dnsblocker'
                                  compileSdk 34

                                  defaultConfig {
                                      applicationId "com.example.dnsblocker"
                                      minSdk 26
                                      targetSdk 34
                                      versionCode 1
                                      versionName "1.0"
                                  }
                                  
                                  buildTypes {
                                      release {
                                          minifyEnabled false
                                      }
                                  }
                                  kotlinOptions {
                                      jvmTarget = "17"
                                  }
                                  

                                  }

                                  dependencies {
                                  implementation "androidx.core:core-ktx:1.12.0"
                                  implementation "androidx.appcompat:appcompat:1.7.0"
                                  implementation "com.google.android.material:material:1.9.0"

                                  implementation 'dnsjava:dnsjava:3.5.2'
                                  

                                  }


                                  1. AndroidManifest.xml (app/src/main/)

                                  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                                  package="com.example.dnsblocker">

                                  <uses-permission android:name="android.permission.INTERNET" />
                                  
                                  <application
                                      android:allowBackup="false"
                                      android:label="@string/app_name"
                                      android:theme="@style/Theme.Material3.DayNight.NoActionBar">
                                  
                                      <activity android:name=".MainActivity"
                                          android:exported="true">
                                          <intent-filter>
                                              <action android:name="android.intent.action.MAIN"/>
                                              <category android:name="android.intent.category.LAUNCHER"/>
                                          </intent-filter>
                                      </activity>
                                  
                                      <service
                                          android:name=".DnsVpnService"
                                          android:permission="android.permission.BIND_VPN_SERVICE"
                                          android:exported="true" />
                                  </application>
                                  

                                  </manifest>


                                  1. res/layout/activity_main.xml

                                  <?xml version="1.0" encoding="utf-8"?>
                                  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                  android:layout_width="match_parent"
                                  android:layout_height="match_parent"
                                  android:gravity="center"
                                  android:orientation="vertical"
                                  android:padding="24dp">

                                  <TextView
                                      android:id="@+id/statusText"
                                      android:layout_width="wrap_content"
                                      android:layout_height="wrap_content"
                                      android:text="חסימת DNS פעילה"
                                      android:textSize="24sp"
                                      android:paddingBottom="20dp"
                                      android:textAlignment="center" />
                                  
                                  <Button
                                      android:id="@+id/toggleButton"
                                      android:layout_width="200dp"
                                      android:layout_height="wrap_content"
                                      android:text="כבה חסימה" />
                                  

                                  </LinearLayout>


                                  1. res/values/strings.xml

                                  <resources>
                                  <string name="app_name">חסימת DNS</string>
                                  </resources>


                                  1. MainActivity.kt (app/src/main/java/com/example/dnsblocker/)

                                  package com.example.dnsblocker

                                  import android.app.AlertDialog
                                  import android.content.Intent
                                  import android.os.Bundle
                                  import android.widget.Button
                                  import android.widget.TextView
                                  import androidx.appcompat.app.AppCompatActivity

                                  class MainActivity : AppCompatActivity() {

                                  private val vpnServiceIntent by lazy { Intent(this, DnsVpnService::class.java) }
                                  private lateinit var toggleBtn: Button
                                  private lateinit var statusText: TextView
                                  
                                  private var vpnRunning = false
                                  
                                  override fun onCreate(savedInstanceState: Bundle?) {
                                      super.onCreate(savedInstanceState)
                                      setContentView(R.layout.activity_main)
                                  
                                      toggleBtn = findViewById(R.id.toggleButton)
                                      statusText = findViewById(R.id.statusText)
                                  
                                      toggleBtn.setOnClickListener {
                                          if (vpnRunning) {
                                              askPasswordAndStop()
                                          } else {
                                              startVpn()
                                          }
                                      }
                                  
                                      startVpn() // הפעלה אוטומטית עם פתיחת האפליקציה
                                  }
                                  
                                  private fun startVpn() {
                                      startService(vpnServiceIntent)
                                      vpnRunning = true
                                      toggleBtn.text = "כבה חסימה"
                                      statusText.text = "חסימת DNS פעילה"
                                  }
                                  
                                  private fun stopVpn() {
                                      stopService(vpnServiceIntent)
                                      vpnRunning = false
                                      toggleBtn.text = "הפעל חסימה"
                                      statusText.text = "חסימת DNS מושבתת"
                                  }
                                  
                                  private fun askPasswordAndStop() {
                                      val input = android.widget.EditText(this).apply {
                                          inputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD
                                      }
                                  
                                      AlertDialog.Builder(this)
                                          .setTitle("הזן סיסמה לביטול חסימה")
                                          .setView(input)
                                          .setPositiveButton("אישור") { dialog, _ ->
                                              val pass = input.text.toString()
                                              if (pass == "1234") {  // שנה כאן את הסיסמה לפי רצונך
                                                  stopVpn()
                                              } else {
                                                  android.widget.Toast.makeText(this, "סיסמה שגויה", android.widget.Toast.LENGTH_SHORT).show()
                                              }
                                              dialog.dismiss()
                                          }
                                          .setNegativeButton("ביטול") { dialog, _ -> dialog.dismiss() }
                                          .show()
                                  }
                                  

                                  }


                                  1. DNSHandler.kt (app/src/main/java/com/example/dnsblocker/)

                                  package com.example.dnsblocker

                                  import org.xbill.DNS.*
                                  import java.net.DatagramPacket
                                  import java.net.DatagramSocket
                                  import kotlin.concurrent.thread

                                  class DNSHandler(
                                  private val blockedDomains: Set<String>,
                                  private val listenPort: Int = 5353
                                  ) {

                                  private var socket: DatagramSocket? = null
                                  private var running = false
                                  
                                  fun start() {
                                      running = true
                                      socket = DatagramSocket(listenPort)
                                      thread(start = true) {
                                          val buffer = ByteArray(512)
                                          while (running) {
                                              try {
                                                  val packet = DatagramPacket(buffer, buffer.size)
                                                  socket?.receive(packet)
                                                  thread {
                                                      handlePacket(packet)
                                                  }
                                              } catch (e: Exception) {
                                                  e.printStackTrace()
                                              }
                                          }
                                          socket?.close()
                                      }
                                  }
                                  
                                  fun stop() {
                                      running = false
                                      socket?.close()
                                  }
                                  
                                  private fun handlePacket(packet: DatagramPacket) {
                                      try {
                                          val request = Message.parse(packet.data)
                                          val query = request.question
                                          val queriedDomain = query.name.toString(true).lowercase()
                                  
                                          val response = Message(request.id)
                                          response.header.rcode = Rcode.NOERROR
                                          response.addRecord(query, Section.QUESTION)
                                          response.header.qr = true // תשובה
                                  
                                          if (isBlocked(queriedDomain)) {
                                              // החזרת NXDOMAIN לאתרים חסומים
                                              response.header.rcode = Rcode.NXDOMAIN
                                          } else {
                                              // העברה לשרת DNS חיצוני (לדוגמה 8.8.8.8)
                                              val forwardResponse = forwardQuery(request)
                                              if (forwardResponse != null) {
                                                  for (section in 0..3) {
                                                      forwardResponse.getSectionArray(section).forEach {
                                                          response.addRecord(it, section)
                                                      }
                                                  }
                                              } else {
                                                  response.header.rcode = Rcode.SERVFAIL
                                              }
                                          }
                                  
                                          val responseData = response.toWire()
                                          val responsePacket = DatagramPacket(
                                              responseData,
                                              responseData.size,
                                              packet.address,
                                              packet.port
                                          )
                                          socket?.send(responsePacket)
                                  
                                      } catch (e: Exception) {
                                          e.printStackTrace()
                                      }
                                  }
                                  
                                  private fun isBlocked(domain: String): Boolean {
                                      return blockedDomains.any { domain.endsWith(it) }
                                  }
                                  
                                  private fun forwardQuery(request: Message): Message? {
                                      return try {
                                          val resolver = SimpleResolver("8.8.8.8")
                                          resolver.timeout = 2
                                          resolver.send(request)
                                      } catch (e: Exception) {
                                          null
                                      }
                                  }
                                  

                                  }


                                  1. DnsVpnService.kt (app/src/main/java/com/example/dnsblocker/)

                                  package com.example.dnsblocker

                                  import android.net.VpnService
                                  import android.content.Intent
                                  import android.os.ParcelFileDescriptor
                                  import kotlin.concurrent.thread

                                  class DnsVpnService : VpnService() {

                                  private var vpnInterface: ParcelFileDescriptor? = null
                                  private var dnsHandler: DNSHandler? = null
                                  
                                  // דוגמת רשימת חסימה - הוסף את הדומיינים שברצונך לחסום כאן
                                  private val blockedDomains = setOf(
                                      "badpornsite.com",
                                      "adultsite.net",
                                      "xxxexample.org",
                                      "exampleporn.com"
                                  )
                                  
                                  override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
                                      setupVpn()
                                      startDnsServer()
                                      return START_STICKY
                                  }
                                  
                                  private fun setupVpn() {
                                      val builder = Builder()
                                      builder.addAddress("10.0.0.2", 32)
                                      builder.addRoute("0.0.0.0", 0)
                                      builder.addDnsServer("127.0.0.1") // DNS פנימי מקומי
                                      builder.setSession("חסימת DNS")
                                      vpnInterface?.close()
                                      vpnInterface = builder.establish()
                                  }
                                  
                                  private fun startDnsServer() {
                                      dnsHandler?.stop()
                                      dnsHandler = DNSHandler(blockedDomains)
                                      dnsHandler?.start()
                                  }
                                  
                                  override fun onDestroy() {
                                      dnsHandler?.stop()
                                      vpnInterface?.close()
                                      super.onDestroy()
                                  }
                                  
                                  override fun onBind(intent: Intent?) = null
                                  

                                  }


                                  סיכום

                                  הפרויקט כולל שירות VPN שפונה ל־DNS פנימי שמפעיל DNSHandler עם רשימת חסימה.

                                  DNSHandler מקבל בקשות DNS, בודק אם הדומיין חסום, מחזיר NXDOM
                                  בממשק המשתמש אפשר להפעיל ולכבות את החסימה עם סיסמה.

                                  זה בסדר?

                                  אריזה לחבילת APK חתומה

                                  רק תגיד!

                                  י מנותק
                                  י מנותק
                                  יאיר דניאל
                                  כתב נערך לאחרונה על ידי יאיר דניאל
                                  #16

                                  @למה-באתי
                                  @למה-באתי כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                                  הבנתי אותך עכשיו — אתה רוצה פרויקט Android מלא ומוכן להעתקה ישירות ל־Android Studio, עם שירות VPN שמשלב DNS פנימי שמבצע סינון לפי רשימת חסימה, כולל רשימת דומיינים בדוגמה, ממשק משתמש להפעלה/כיבוי עם סיסמה.
                                  וכו' וכו'...

                                  פעם הבאה, בתוך ספויילר, הלך לי היד מהגלילה...

                                  תגובה 1 תגובה אחרונה
                                  2
                                  • I מנותק
                                    I מנותק
                                    iosi poli
                                    כתב נערך לאחרונה על ידי
                                    #17

                                    ליצור עם AI סטדיו. בחיים לא עם GPT (ספציפית זה).

                                    וזה פשוט אפליקצית VPN לחסימת דומיינים, וזה כבר קיים.

                                    למה באתיל תגובה 1 תגובה אחרונה
                                    0
                                    • I iosi poli

                                      ליצור עם AI סטדיו. בחיים לא עם GPT (ספציפית זה).

                                      וזה פשוט אפליקצית VPN לחסימת דומיינים, וזה כבר קיים.

                                      למה באתיל מנותק
                                      למה באתיל מנותק
                                      למה באתי
                                      מדריכים
                                      כתב נערך לאחרונה על ידי
                                      #18

                                      @iosi-poli כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:

                                      ליצור עם AI סטדיו. בחיים לא עם GPT (ספציפית זה).

                                      וזה פשוט אפליקצית VPN לחסימת דומיינים, וזה כבר קיים.

                                      תראה לי.
                                      אדרבה.
                                      Ai studio לא עובד בכלל באנדרואיד. ואני כעת רק עם אנדרואיד

                                      תגובה 1 תגובה אחרונה
                                      0

                                      • התחברות

                                      • אין לך חשבון עדיין? הרשמה

                                      • התחברו או הירשמו כדי לחפש.
                                      • פוסט ראשון
                                        פוסט אחרון
                                      0
                                      • חוקי הפורום
                                      • פופולרי
                                      • לא נפתר
                                      • משתמשים
                                      • חיפוש גוגל בפורום
                                      • צור קשר