Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1712 / 579 / 76
Регистрация: 10.04.2009
Сообщений: 9,323

Установить название сети и всё что с ней связано

01.06.2025, 20:19. Показов 970. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте, на Андроид Студио делаю первые шаги, установил данное ПО, открыл, нажал Нью Проджект
моя цель чтобы на смартфоне с ОС Андроид при открытии приложения можно было бы увидеть тоже самое, что я вижу на смартфоне, если вручную захожу Настройки Сеть Вай Фай - название сети, МАС-адрес, Айпи-адрес, шлюз, маска подсети, ДНС, IPv6-адреса
джипити мне в помощь
три файл правили вместе:
манифест AndroidManifest.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.networkinfo">
 
    <!-- Разрешение для доступа к состоянию Wi-Fi -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 
    <!-- Разрешение для доступа к состоянию сети -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
    <!-- Разрешение для доступа к местоположению (необходимо для получения SSID) -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 
    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.NetworkInfo">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
MainActivity.kt
Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.example.networkinfo
 
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.net.ConnectivityManager
import android.net.DhcpInfo
import android.net.wifi.WifiInfo
import android.net.wifi.WifiManager
import android.os.Build
import android.os.Bundle
import android.text.format.Formatter
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
 
class MainActivity : AppCompatActivity() {
 
    private lateinit var infoTextView: TextView
 
    private val requestPermissionsLauncher = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        var grantedAll = true
        permissions.entries.forEach {
            if (!it.value) grantedAll = false
        }
        if (grantedAll) {
            showNetworkInfo()
        } else {
            infoTextView.text = "Не получены все необходимые разрешения"
        }
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        infoTextView = findViewById(R.id.infoTextView)
 
        checkPermissionsAndShowInfo()
    }
 
    private fun checkPermissionsAndShowInfo() {
        val neededPermissions = mutableListOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_WIFI_STATE,
            Manifest.permission.ACCESS_NETWORK_STATE
        )
 
        // Понадобится запрос разрешений на Android 6+
        val permissionsToRequest = neededPermissions.filter {
            ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
        }
 
        if (permissionsToRequest.isNotEmpty()) {
            requestPermissionsLauncher.launch(permissionsToRequest.toTypedArray())
        } else {
            showNetworkInfo()
        }
    }
 
    private fun showNetworkInfo() {
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
 
        val wifiInfo: WifiInfo? = wifiManager.connectionInfo
        val dhcpInfo: DhcpInfo = wifiManager.dhcpInfo
 
        if (wifiInfo == null) {
            infoTextView.text = "Wi-Fi не подключен"
            return
        }
 
        // SSID и MAC
        val ssid = wifiInfo.ssid.trim('"')
        val macAddress = wifiInfo.macAddress ?: "Не доступен" // MAC телефона (но с Android 6 это обычно 02:00:00:00:00:00 из-за ограничений)
 
        // IP адрес устройства (IPv4)
        val ipAddress = Formatter.formatIpAddress(wifiInfo.ipAddress)
 
        // DHCP шлюз, маска подсети, DNS
        val gateway = Formatter.formatIpAddress(dhcpInfo.gateway)
        val netmask = Formatter.formatIpAddress(dhcpInfo.netmask)
        val dns1 = Formatter.formatIpAddress(dhcpInfo.dns1)
        val dns2 = Formatter.formatIpAddress(dhcpInfo.dns2)
 
        // IPv6 адреса получить сложнее, попробуем через NetworkInterfaces снизу
        val ipv6Addresses = getIPv6Addresses()
 
        val sb = StringBuilder()
        sb.append("Имя сети (SSID): ").appendLine(ssid)
        sb.append("MAC-адрес устройства: ").appendLine(macAddress)
        sb.append("IP-адрес: ").appendLine(ipAddress)
        sb.append("Шлюз (Gateway): ").appendLine(gateway)
        sb.append("Маска подсети: ").appendLine(netmask)
        sb.append("DNS1: ").appendLine(dns1)
        sb.append("DNS2: ").appendLine(dns2)
        sb.append("IPv6 адреса:").appendLine()
        ipv6Addresses.forEach {
            sb.append(" - ").appendLine(it)
        }
 
        infoTextView.text = sb.toString()
    }
 
    private fun getIPv6Addresses(): List<String> {
        val result = mutableListOf<String>()
        try {
            val interfaces = java.net.NetworkInterface.getNetworkInterfaces()
            for (intf in interfaces) {
                val addrs = intf.inetAddresses
                for (addr in addrs) {
                    if (!addr.isLoopbackAddress) {
                        val sAddr = addr.hostAddress
                        // Проверяем на IPv6
                        if (sAddr.indexOf(':') >= 0) {
                            // Удаляем %зону, если есть
                            val cleanAddr = sAddr.substringBefore('%')
                            result.add(cleanAddr)
                        }
                    }
                }
            }
        } catch (e: Exception) {
            // игнорируем ошибки
        }
        return result
    }
}
build.gradle.kts
Kotlin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose)
}
 
android {
    namespace = "com.example.myapplication"
    compileSdk = 35
 
    defaultConfig {
        applicationId = "com.example.myapplication"
        minSdk = 24
        targetSdk = 35
        versionCode = 1
        versionName = "1.0"
 
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
 
    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = "11"
    }
    buildFeatures {
        compose = true
    }
}
 
dependencies {
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.lifecycle.runtime.ktx)
    implementation(libs.androidx.activity.compose)
    implementation(platform(libs.androidx.compose.bom))
    implementation(libs.androidx.ui)
    implementation(libs.androidx.ui.graphics)
    implementation(libs.androidx.ui.tooling.preview)
    implementation(libs.androidx.material3)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    androidTestImplementation(platform(libs.androidx.compose.bom))
    androidTestImplementation(libs.androidx.ui.test.junit4)
    debugImplementation(libs.androidx.ui.tooling)
    debugImplementation(libs.androidx.ui.test.manifest)
}
джипити вещь НЕ очень надёжная, если ещё мало что в этом понимаешь...
хот доля правды в этих кодах есть?
и главное, по юсб пытался с помощью эмулятора запустить и всё завило, какая может быть причина? есть способы добиться этой цели попроще? спасибо

Добавлено через 17 минут
тут выясняется, что если юзать Cordova всё намного проще:
JavaScript
1
2
3
4
5
6
7
8
9
import { NetworkInterface } from '@ionic-native/network-interface';
constructor(private networkInterface: NetworkInterface) {
    this.networkInterface.getWiFiIPAddress()
    .then(address => {
        console.info(`IP: ${address.ip}, Subnet: ${address.subnet}`);
        // Здесь можно добавить код для отображения других данных
    })
    .catch(error => console.error(`Unable to get IP: ${error}`));
}
так и есть? справиться она с моей задачей?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2025, 20:19
Ответы с готовыми решениями:

Vk API - Необходимо обработать все ошибки связанные с сетью
Вообщем есть ТЗ на работу с API вконтакта. Я собственно все сделал, за исключением одного пункта....

Создание Android-приложения связанного с "Вконтакте"
Всем привет! Появилась такая идея создать приложения для своей группы &quot;Вконтакте&quot;. Кто бы мог мне...

Reject связанный с механизмом логина
Всем привет! Получил вчера письмо счастья о том, что мое приложение отклонено. Ругаются на...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2025, 20:19
Помогаю со студенческими работами здесь

Заполнение связанных Spinner массивами из строк
Всем привет. Первый спиннер заполняется элементами массива строк (массив прописан в ресурсах), по...

SQLite Связаные таблицы
Есть таблицы Магазин и товар - Магазин как ключевая. Одну таблицу создает сразу две не хочет. ...

Связанные TableView
Подскажите как мне реализовать два связанных TableView на одном ViewController? Мне не понятны...

SQLiteOpenHelper и связанные таблицы
Ребят подскажите плз начинающему. В интернете примеры видел только с одной таблицей. Но у меня...

Жизненный цикл активити при наличии связанного бэкграунд-сервиса
Пишу простую аппку для запуска и менеджинга бэкграунд-сервиса. подскажите по азам - я правильно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru