ConnectivityManager getNetworkInfo (int) 추천하지 않습니다
그러나 compileSdkVersion 23 사용하여 9까지 지원합니다.
getNetworkInfo(int)
(23)에서 사용되지 않는 된 제안은 사용하는 것이 었 getAllNetworks()
하고 getNetworkInfo(Network)
대신. 그러나이 두 가지 모두 최소 API 21이 필요합니다.
이를 지원할 수있는 지원 패키지에 사용할 수있는 클래스가 있습니까?
나는 해결책이 이전 에 제안되었다는 것을 알고 있지만, 9의 최소 API 요구 사항에 대한 문제는 문제를 일으킨다.
당신이 사용할 수있는:
getActiveNetworkInfo ();
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) {
// connected to the internet
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
// connected to wifi
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
// connected to mobile data
}
} else {
// not connected to the internet
}
또는 스위치 케이스
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) {
// connected to the internet
switch (activeNetwork.getType()) {
case ConnectivityManager.TYPE_WIFI:
// connected to wifi
break;
case ConnectivityManager.TYPE_MOBILE:
// connected to mobile data
break;
default:
break;
}
} else {
// not connected to the internet
}
2018 년 10 월부터는 답변이 더 이상 사용되지 않습니다.
getType()
및 유형 자체는 이제 API 레벨 28에서 더 이상 사용되지 않습니다. Javadoc에서 :
호출자는 NetworkCapabilities # TRANSPORT * 상수 중 하나를 사용하여 NetworkCapabilities # hasTransport 확인 대신 전환해야합니다.
를 사용하려면 인스턴스를 메소드 NetworkCapabilities
에 전달해야합니다 . 해당 인스턴스를 얻으려면 API 레벨 23에 추가 된 호출해야합니다 .Network
getNetworkCapabilities()
getActiveNetwork()
따라서 현재 Wi-Fi 또는 셀룰러 네트워크에 연결되어 있는지 안전하게 확인하는 올바른 방법은 다음과 같습니다.
public static boolean isNetworkConnected() {
final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm != null) {
if (Build.VERSION.SDK_INT < 23) {
final NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null) {
return (ni.isConnected() && (ni.getType() == ConnectivityManager.TYPE_WIFI || ni.getType() == ConnectivityManager.TYPE_MOBILE));
}
} else {
final Network n = cm.getActiveNetwork();
if (n != null) {
final NetworkCapabilities nc = cm.getNetworkCapabilities(n);
return (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
}
}
}
return false;
}
다른 유형의을 확인할 수도 TRANSPORT
있습니다 ( 여기에서 찾을 수 있음) .
중요 사항 : Wi-Fi 및 VPN에 연결되어 있으면 현재 상태가 될 수 있으므로 TRANSPORT_VPN
확인해야 할 수도 있습니다.
AndroidManifest 파일에 다음 권한을 추가하는 것을 잊지 마십시오.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
허용 대답은 다시 사용되지 않습니다 에 28 (Android P)
있지만 교체 방법은에서만 작동합니다 23 (Android M)
. 구형 장치를 지원하기 위해 도우미 기능을 작성했습니다.
사용하는 방법:
int type = getConnectionType(getApplicationContext());
를 반환하면 코드에서로 int
변경할 수 있습니다 enum
.
0 : 인터넷을 사용할 수 없습니다 (비행기 모드 또는 Wi-Fi 가입 중일 수 있음).
1 : 셀룰러 (모바일 데이터, 3G / 4G / LTE)
2 : Wi-Fi.
Kotlin 또는 Java 버전의 도우미 함수를 복사 할 수 있습니다.
코 틀린 :
@IntRange(from = 0, to = 2)
fun getConnectionType(context: Context): Int {
var result = 0 // Returns connection type. 0: none; 1: mobile data; 2: wifi
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cm?.run {
cm.getNetworkCapabilities(cm.activeNetwork)?.run {
if (hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
result = 2
} else if (hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
result = 1
}
}
}
} else {
cm?.run {
cm.activeNetworkInfo?.run {
if (type == ConnectivityManager.TYPE_WIFI) {
result = 2
} else if (type == ConnectivityManager.TYPE_MOBILE) {
result = 1
}
}
}
}
return result
}
자바:
@IntRange(from = 0, to = 2)
public static int getConnectionType(Context context) {
int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (cm != null) {
NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
result = 2;
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
result = 1;
}
}
}
} else {
if (cm != null) {
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) {
// connected to the internet
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
result = 2;
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
result = 1;
}
}
}
}
return result;
}
업데이트 된 답변 (19 : 07 : 2018) :
이 방법은 인터넷 연결이 가능한지 확인하는 데 도움이됩니다.
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
return (activeNetwork != null && activeNetwork.isConnectedOrConnecting());
} else {
return false;
}
}
이전 답변 :
최상의 코드 재사용 연습을 위해 Cheese Bread 답변을 개선하십시오.
public static boolean isNetworkAvailable(Context context) {
int[] networkTypes = {ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI};
try {
ConnectivityManager connectivityManager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
for (int networkType : networkTypes) {
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo != null &&
activeNetworkInfo.getType() == networkType)
return true;
}
} catch (Exception e) {
return false;
}
return false;
}
코드는 Util 클래스에 배치 할 수 있으며 응용 프로그램의 어느 부분에서나 전화가 Wifi 또는 모바일 인터넷을 통해 인터넷에 연결되어 있는지 확인하는 데 사용할 수 있습니다.
수락 된 답변은 버전 28에서 더 이상 사용되지 않으므로 다음은 프로젝트에서 사용중인 솔루션입니다.
연결 유형을 반환합니다. false : 인터넷 연결이 없습니다. true : 모바일 데이터 || 와이파이
public static boolean isNetworkConnected(Context context) {
boolean result = false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (cm != null) {
NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork());
if (capabilities != null) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
result = true;
} else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
result = true;
}
}
}
} else {
if (cm != null) {
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) {
// connected to the internet
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
result = true;
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
result = true;
}
}
}
}
return result;
}
온라인 상태인지 확인하려면 :
boolean isOnline() {
// Checking internet connectivity
ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = null;
if (connectivityMgr != null) {
activeNetwork = connectivityMgr.getActiveNetworkInfo();
}
return activeNetwork != null;
}
안드로이드 M 전후에 인터넷 연결 유형을 얻으려면
void internetType() {
// Checking internet connectivity
ConnectivityManager connectivityMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = null;
if (connectivityMgr != null) {
activeNetwork = connectivityMgr.getActiveNetworkInfo();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NetworkCapabilities nc = connectivityMgr.getNetworkCapabilities(connectivityMgr.getActiveNetwork());
if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
// connected to mobile data
} else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
// connected to wifi
}
} else {
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
// connected to wifi
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
// connected to mobile data
}
}
}
}
모든 경우에 네트워크 상태에 액세스 할 수있는 권한이 필요합니다
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
네트워크가 인터넷에 연결되어 있는지 확인하는 것이 좋습니다.
@Suppress("DEPRECATION")
fun isNetworkAvailable(context: Context): Boolean {
try {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return if (Build.VERSION.SDK_INT > 22) {
val an = cm.activeNetwork ?: return false
val capabilities = cm.getNetworkCapabilities(an) ?: return false
capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
} else {
val a = cm.activeNetworkInfo ?: return false
a.isConnected && (a.type == ConnectivityManager.TYPE_WIFI || a.type == ConnectivityManager.TYPE_MOBILE)
}
} catch (e: Exception) {
e.printStackTrace()
}
return false
}
인터넷 연결을 두 번 이상 확인해야 할 수도 있습니다. 따라서의 확장 방법으로 코드 블록을 작성하면 더 쉬울 것입니다 Context
. 다음은 내 도우미의 확장입니다 Context
및 Fragment
.
인터넷 연결 확인
fun Context.hasInternet(): Boolean {
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return if (Build.VERSION.SDK_INT < 23) {
val activeNetworkInfo = connectivityManager.activeNetworkInfo
activeNetworkInfo != null && activeNetworkInfo.isConnected
} else {
val nc = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
if (nc == null) {
false
} else {
nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
}
}
}
다른 확장
fun Context.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) {
if (hasInternet()) {
trueFunc(true)
} else if (notifyNoInternet) {
Toast.makeText(this, "No Internet Connection!", Toast.LENGTH_SHORT).show()
}
}
fun Context.hasInternet(
trueFunc: (internet: Boolean) -> Unit,
falseFunc: (internet: Boolean) -> Unit
) {
if (hasInternet()) {
trueFunc(true)
} else {
falseFunc(true)
}
}
fun Fragment.hasInternet(): Boolean = context!!.hasInternet()
fun Fragment.hasInternet(notifyNoInternet: Boolean = true, trueFunc: (internet: Boolean) -> Unit) =
context!!.hasInternet(notifyNoInternet, trueFunc)
fun Fragment.hasInternet(
trueFunc: (internet: Boolean) -> Unit, falseFunc: (internet: Boolean) -> Unit
) = context!!.hasInternet(trueFunc, falseFunc)
로 치즈 빵 제안 , 사용 ) (getActiveNetworkInfo를
getActiveNetworkInfo
API 레벨 1에 추가됨
NetworkInfo getActiveNetworkInfo ()
현재 활성화 된 기본 데이터 네트워크에 대한 세부 정보를 반환합니다. 연결되면이 네트워크는 발신 연결의 기본 경로입니다. 네트워크 트래픽을 시작하기 전에 항상 isConnected ()를 확인해야합니다. 기본 네트워크가 없으면 null을 반환 할 수 있습니다. 이 방법을 사용하려면 호출자가 ACCESS_NETWORK_STATE 권한을 보유해야합니다. 현재 기본 네트워크에 대한 NetworkInfo 네트워크 정보 객체를 반환하거나 현재 활성화 된 기본 네트워크가 없으면 null을 반환합니다.
참조 : Android Studio
public final boolean isInternetOn() {
// get Connectivity Manager object to check connection
ConnectivityManager connec =
(ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE);
// Check for network connections
if ( connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTED ||
connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.CONNECTING ) {
// if connected with internet
Toast.makeText(this, connec.getActiveNetworkInfo().getTypeName(), Toast.LENGTH_LONG).show();
return true;
} else if (
connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED ||
connec.getActiveNetworkInfo().getState() == android.net.NetworkInfo.State.DISCONNECTED ) {
Toast.makeText(this, " Not Connected ", Toast.LENGTH_LONG).show();
return false;
}
return false;
}
안전한 사용을 위해 이제 메소드를 호출하십시오.
try {
if (isInternetOn()) { /* connected actions */ }
else { /* not connected actions */ }
} catch (Exception e){
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
그리고 다음을 추가하는 것을 잊지 마십시오 :
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
안전한면에 있으려면 방법을 사용하는 것이 좋습니다.
NetworkInfo.isConnected ()
전체 방법은 다음과 같습니다.
/**
* Checking whether network is connected
* @param context Context to get {@link ConnectivityManager}
* @return true if Network is connected, else false
*/
public static boolean isConnected(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
int networkType = activeNetwork.getType();
return networkType == ConnectivityManager.TYPE_WIFI || networkType == ConnectivityManager.TYPE_MOBILE;
} else {
return false;
}
}
코 틀린 버전 :
fun isInternetOn(context: Context): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
val activeNetwork = cm?.activeNetworkInfo
return activeNetwork != null && activeNetwork.isConnected
}
최신 Android 버전에서 현재 네트워크가 셀룰러를 사용 중인지 확인하는 방법은 다음과 같습니다.
val isCellular: Boolean get() {
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cm.getNetworkCapabilities(cm.activeNetwork).hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
} else {
cm.activeNetworkInfo?.type == ConnectivityManager.TYPE_MOBILE
}
}
(거의) 모든 답변은 Android P에서 더 이상 사용되지 않으므로 여기에 C#
솔루션 이 있습니다 ( Java 개발자가 쉽게 따라 할 수 있습니다 )
public bool IsOnline(Context context)
{
var cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
if (cm == null) return false;
if (Build.VERSION.SdkInt < BuildVersionCodes.M)
{
var ni = cm.ActiveNetworkInfo;
if (ni == null) return false;
return ni.IsConnected && (ni.Type == ConnectivityType.Wifi || ni.Type == ConnectivityType.Mobile);
}
return cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Wifi)
|| cm.GetNetworkCapabilities(cm.ActiveNetwork).HasTransport(Android.Net.TransportType.Cellular);
}
여기서 핵심은 Android.Net.TransportType
인터넷 사용 가능 여부 확인
@RequiresPermission(allOf = [
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.INTERNET
])
fun isInternetAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
val activeNetworkInfo = connectivityManager!!.activeNetworkInfo
return activeNetworkInfo != null && activeNetworkInfo.isConnected
}
public boolean isConnectedToWifi(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return false;
}
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
Network network = connectivityManager.getActiveNetwork();
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities == null) {
return false;
}
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
} else {
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (networkInfo == null) {
return false;
}
return networkInfo.isConnected();
}
}
게시 된 답변은 활성 네트워크 만 쿼리 할 수 있으므로 활성 네트워크 NetworkInfo
(예 : Wi-Fi 네트워크)뿐만 아니라 모든 네트워크에 액세스 하는 방법은 다음과 같습니다 (죄송합니다. Kotlin 코드)
(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).run {
allNetworks.find { getNetworkInfo(it).type == ConnectivityManager.TYPE_WIFI }?.let { network -> getNetworkInfo(network) }
// getNetworkInfo(ConnectivityManager.TYPE_WIFI).isAvailable // This is the deprecated API pre-21
}
API 21 이상과 권한이 필요합니다 android.permission.ACCESS_NETWORK_STATE
Kotlin을 사용하여 Android에서 인터넷 연결을 확인하는 데 사용할 수있는 NetManager
minSdkVersion> = 23 을 사용하는 경우
class NetManager @Inject constructor(var applicationContext: Context) {
val isConnectedToInternet: Boolean?
get() = with(
applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
) {
isConnectedToInternet()
}
}
fun ConnectivityManager.isConnectedToInternet() = isConnected(getNetworkCapabilities(activeNetwork))
fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
return when (networkCapabilities) {
null -> false
else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
}
}
minSdkVersion <23 을 사용하는 경우
class NetManager @Inject constructor(var applicationContext: Context) {
val isConnectedToInternet: Boolean?
get() = with(
applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
) {
isConnectedToInternet()
}
}
fun ConnectivityManager.isConnectedToInternet(): Boolean = if (Build.VERSION.SDK_INT < 23) {
isConnected(activeNetworkInfo)
} else {
isConnected(getNetworkCapabilities(activeNetwork))
}
fun isConnected(network: NetworkInfo?): Boolean {
return when (network) {
null -> false
else -> with(network) { isConnected && (type == TYPE_WIFI || type == TYPE_MOBILE) }
}
}
fun isConnected(networkCapabilities: NetworkCapabilities?): Boolean {
return when (networkCapabilities) {
null -> false
else -> with(networkCapabilities) { hasTransport(TRANSPORT_CELLULAR) || hasTransport(TRANSPORT_WIFI) }
}
}
참고 URL : https://stackoverflow.com/questions/32547006/connectivitymanager-getnetworkinfoint-deprecated
'program story' 카테고리의 다른 글
원격 추적 분기에서 'git fetch'및 'git merge'를 어떻게 수행합니까 (예 : 'git pull') (0) | 2020.07.28 |
---|---|
파일의 처음 n 줄만 잡을 수 있습니까? (0) | 2020.07.28 |
Retrofit 2로 빈 반응 바디를 어떻게 처리 할 수 있습니까? (0) | 2020.07.28 |
“-”대시를 사용하여 JSON 속성에 액세스 할 수 없습니다 (0) | 2020.07.28 |
안드로이드에서 UI 스레드를 감지하는 방법? (0) | 2020.07.28 |