בקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים
-
הבנתי אותך עכשיו — אתה רוצה פרויקט 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
- settings.gradle
rootProject.name = "DNSBlocker"
include(":app")
- build.gradle (שורש)
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.0.2'
}
}allprojects {
repositories {
google()
mavenCentral()
}
}
- app/build.gradle
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}android {
namespace 'com.example.dnsblocker'
compileSdk 34defaultConfig { 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'
}
- 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>
- 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>
- res/values/strings.xml
<resources>
<string name="app_name">חסימת DNS</string>
</resources>
- 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.AppCompatActivityclass 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() }
}
- 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.threadclass 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 } }
}
- 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.threadclass 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 חתומה
רק תגיד!
-
@YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:
@למה-באתי שלח קוד מקור מלא כולל כל הספריות כי אני עם נטפרי
אין קוד מקור . יש קודים פשוט.
-
@למה-באתי אתה יכול פשוט לארוז לקובץ זיפ בעצמך?
פשוט תיצור את כל הקבצים והתקיות לפי הסדר הנכון ותעלה את הזיפ,קח בחשבון שלא הייתי בונה על זה שזה לא יהיה מלא שגיאות במיוחד שזה קוד ראשוני איך שאני מבין
@YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:
@למה-באתי אתה יכול פשוט לארוז לקובץ זיפ בעצמך?
פשוט תיצור את כל הקבצים והתקיות לפי הסדר הנכון ותעלה את הזיפ,קח בחשבון שלא הייתי בונה על זה שזה לא יהיה מלא שגיאות במיוחד שזה קוד ראשוני איך שאני מבין
איך אני יוצר ? אין לי אנדרואיד סטודיו בזמין
-
@שלמה-רביב כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:
@למה-באתי אפשר לשאול מה זה?
לא הכל חייב לדעת.
אם לא כתבתי סימן שלא צריכים לדעת... -
@מישהו12 כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:
תבקש מGPT ליצור לך את זה בZIP מוכן לאנדרואיד סטודיו כולל הכל
לוקח מלאאא זמן
12 שעות. -
@מישהו12 כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:
@למה-באתי מה???????????????????
לי הוא עשה דברים כאלו בדקות. -
@YOLEVI כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:
@למה-באתי אתה יכול פשוט לארוז לקובץ זיפ בעצמך?
פשוט תיצור את כל הקבצים והתקיות לפי הסדר הנכון ותעלה את הזיפ,קח בחשבון שלא הייתי בונה על זה שזה לא יהיה מלא שגיאות במיוחד שזה קוד ראשוני איך שאני מבין
איך אני יוצר ? אין לי אנדרואיד סטודיו בזמין
-
הבנתי אותך עכשיו — אתה רוצה פרויקט 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
- settings.gradle
rootProject.name = "DNSBlocker"
include(":app")
- build.gradle (שורש)
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.0.2'
}
}allprojects {
repositories {
google()
mavenCentral()
}
}
- app/build.gradle
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}android {
namespace 'com.example.dnsblocker'
compileSdk 34defaultConfig { 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'
}
- 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>
- 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>
- res/values/strings.xml
<resources>
<string name="app_name">חסימת DNS</string>
</resources>
- 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.AppCompatActivityclass 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() }
}
- 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.threadclass 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 } }
}
- 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.threadclass 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 חתומה
רק תגיד!
@למה-באתי
@למה-באתי כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:הבנתי אותך עכשיו — אתה רוצה פרויקט Android מלא ומוכן להעתקה ישירות ל־Android Studio, עם שירות VPN שמשלב DNS פנימי שמבצע סינון לפי רשימת חסימה, כולל רשימת דומיינים בדוגמה, ממשק משתמש להפעלה/כיבוי עם סיסמה.
וכו' וכו'...פעם הבאה, בתוך ספויילר, הלך לי היד מהגלילה...
-
ליצור עם AI סטדיו. בחיים לא עם GPT (ספציפית זה).
וזה פשוט אפליקצית VPN לחסימת דומיינים, וזה כבר קיים.
@iosi-poli כתב בבקשה | מחפש מישהו עם ידע באנדרואיד סטודיו לצורך עבודה קטנה לזיכוי הרבים:
ליצור עם AI סטדיו. בחיים לא עם GPT (ספציפית זה).
וזה פשוט אפליקצית VPN לחסימת דומיינים, וזה כבר קיים.
תראה לי.
אדרבה.
Ai studio לא עובד בכלל באנדרואיד. ואני כעת רק עם אנדרואיד