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}`));
} |
|
так и есть? справиться она с моей задачей?