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

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

01.06.2025, 20:19. Показов 988. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru