【问题标题】:Controlling network connectivity on Android在 Android 上控制网络连接
【发布时间】:2022-07-07 00:24:49
【问题描述】:

我正在制作一个示例应用,只是为了看看如何在 Android 上监控网络连接。

为此,我遵循此文档: https://developer.android.com/training/monitoring-device-state/connectivity-status-type

由于我没有得到预期的结果,我决定创建这篇文章,希望从有经验的用户那里获得一些相关的反馈。

以下,我的源代码仅限于一个文件:MainActivity.kt。

package me.soft.network

import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    lateinit var networkRequest: NetworkRequest
    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        // network is available for use
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            println("onAvailable --- CALLED")
        }

        // Network capabilities have changed for the network
        override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
        ) {
            super.onCapabilitiesChanged(network, networkCapabilities)
            val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.  NET_CAPABILITY_NOT_METERED)
            println("onCapabilitiesChanged --- CALLED")
        }

        // lost network connection
        override fun onLost(network: Network) {
            super.onLost(network)
            println("onLost --- CALLED")
        }
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        networkRequest = NetworkRequest.Builder()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
            .build()

        val connectivityManager = getSystemService(ConnectivityManager::class.java) as  ConnectivityManager
        connectivityManager.requestNetwork(networkRequest, networkCallback)
    }
}

正如人们所注意到的,它主要直接来自我上面提到的文档。 启动应用程序后,我希望看到它运行并通过调用函数对设备连接状态发生的任何事情做出反应:onAvailable、onCapabilitiesChanged、onLost of the networkCallback ConnectivityManager.NetworkCallback 对象。但这不会发生,而是应用在启动后立即终止。

我做错了什么?

【问题讨论】:

    标签: android kotlin network-programming android-connectivitymanager


    【解决方案1】:

    首先,转到您的清单文件并在下面添加权限

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    

    也转到 MainActivity 标签并检查

    android:exported="true" 
    

    为真与否,如果不设置为真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-12
      • 2021-03-29
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      相关资源
      最近更新 更多