Bagaimana Anda mendeteksi jenis koneksi jaringan di Android?
Apakah sudah selesai ConnectivityManager.getActiveNetworkInfo().getType()
, dan apakah jawabannya terbatas pada Wifi dan seluler?
sumber
Bagaimana Anda mendeteksi jenis koneksi jaringan di Android?
Apakah sudah selesai ConnectivityManager.getActiveNetworkInfo().getType()
, dan apakah jawabannya terbatas pada Wifi dan seluler?
Jika masalahnya adalah menemukan apakah jaringan telepon terhubung dan cukup cepat untuk memenuhi permintaan Anda, Anda harus menangani semua jenis jaringan yang dikembalikan oleh getSubType()
.
Butuh satu atau dua jam bagi saya untuk meneliti dan menulis kelas ini untuk melakukan hal itu, dan saya pikir saya akan membaginya dengan orang lain yang mungkin berguna.
Berikut adalah Intisari dari kelas , sehingga Anda dapat memotong dan mengeditnya.
package com.emil.android.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
/**
* Check device's network connectivity and speed
* @author emil http://stackoverflow.com/users/220710/emil
*
*/
public class Connectivity {
/**
* Get the network info
* @param context
* @return
*/
public static NetworkInfo getNetworkInfo(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* Check if there is any connectivity
* @param context
* @return
*/
public static boolean isConnected(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected());
}
/**
* Check if there is any connectivity to a Wifi network
* @param context
* @return
*/
public static boolean isConnectedWifi(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
/**
* Check if there is any connectivity to a mobile network
* @param context
* @return
*/
public static boolean isConnectedMobile(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
/**
* Check if there is fast connectivity
* @param context
* @return
*/
public static boolean isConnectedFast(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype()));
}
/**
* Check if the connection is fast
* @param type
* @param subType
* @return
*/
public static boolean isConnectionFast(int type, int subType){
if(type==ConnectivityManager.TYPE_WIFI){
return true;
}else if(type==ConnectivityManager.TYPE_MOBILE){
switch(subType){
case TelephonyManager.NETWORK_TYPE_1xRTT:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_CDMA:
return false; // ~ 14-64 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return true; // ~ 400-1000 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return true; // ~ 600-1400 kbps
case TelephonyManager.NETWORK_TYPE_GPRS:
return false; // ~ 100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
return true; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_HSPA:
return true; // ~ 700-1700 kbps
case TelephonyManager.NETWORK_TYPE_HSUPA:
return true; // ~ 1-23 Mbps
case TelephonyManager.NETWORK_TYPE_UMTS:
return true; // ~ 400-7000 kbps
/*
* Above API level 7, make sure to set android:targetSdkVersion
* to appropriate level to use these
*/
case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11
return true; // ~ 1-2 Mbps
case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
return true; // ~ 5 Mbps
case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
return true; // ~ 10-20 Mbps
case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
return false; // ~25 kbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return false;
}
}else{
return false;
}
}
}
Pastikan juga untuk menambahkan izin ini ke AndroidManifest.xml Anda
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
Sumber untuk kecepatan jaringan termasuk wikipedia & http://3gstore.com/page/78_what_is_evdo_mobile_broadband.html
public static final int
. Jadi Anda tidak perlu melakukan "retas". Hanya menargetkan SDK terbaru, kompiler mengkompilasi nilai nyata (integer) yang mereka tunjuk (bukan instans mereka) ke dalam bytecode.targetSdkVersion
pengaturan. Saya mengedit posting untuk menghapus retas, terima kasih.Untuk mendapatkan informasi yang lebih tepat (dan ramah pengguna) tentang jenis koneksi. Anda dapat menggunakan kode ini (berasal dari metode menyembunyikan di TelephonyManager.java ).
Metode ini mengembalikan sebuah String yang menggambarkan tipe koneksi saat ini.
yaitu salah satu dari: "WIFI", "2G", "3G", "4G", "5G", "-" (tidak terhubung) atau "?" (tidak diketahui)
Catatan: Kode ini memerlukan API 25+, tetapi Anda dapat dengan mudah mendukung versi yang lebih lama dengan menggunakan int bukan const. (Lihat komentar dalam kode).
sumber
Anda dapat menggunakan getSubtype () untuk lebih jelasnya. Lihat slide 9 di sini: http://dl.google.com/io/2009/pres/W_0300_CodingforLife-BatteryLifeThatIs.pdf
Juga, silakan periksa jawaban Emil untuk menyelam lebih dalam ke dalam ini.
sumber
@ Jawaban Emil di atas sangat brilian.
Tambahan kecil: Kita sebaiknya menggunakan TelephonyManager untuk mendeteksi tipe jaringan. Jadi yang di atas seharusnya dibaca:
sumber
Jawaban dari Emil Davtyan baik, tetapi jenis jaringan telah ditambahkan yang tidak diperhitungkan dalam jawabannya. Jadi,
isConnectionFast(int type, int subType)
bisa mengembalikan false padahal seharusnya benar.Berikut adalah kelas yang dimodifikasi yang menggunakan refleksi untuk menjelaskan tipe jaringan tambahan di API selanjutnya:
sumber
if (NetworkUtils.isWifiConnection(this) { /* do stuff */ }
Anda dapat membuat Metode khusus untuk menyelesaikan tugas ini.
sumber
Di atas jawaban awam Emil saya ingin menambahkan satu metode lagi, untuk memeriksa apakah Anda benar-benar memiliki akses Internet karena Anda dapat menonaktifkan data di ponsel Anda.
Perhatikan bahwa ini hanya untuk memeriksa apakah ada koneksi data seluler dan akan mengembalikan false jika Anda memiliki WiFi yang terhubung, karena data seluler dimatikan ketika WiFi terhubung.
sumber
Anda dapat memeriksa seperti ini
sumber
seharusnya memberi Anda nama jaringan
sumber
Saat ini, hanya MOBILE dan WIFI yang didukung. Lihatlah dan fungsi tipe yang dapat dibaca manusia .
sumber
Anda dapat mencoba ini:
sumber
Deteksi jenis jaringan apa dan dapatkan nilai boolean dari sambungan atau tidak menggunakan cuplikan di bawah ini
Gunakan ini mengikuti kelas lulus konteks Anda akan mendapatkan status jaringan seperti jenis jaringan, jaringan cepat, dll.
sumber
Di bawah ini ditunjukkan berbagai cara untuk melakukan itu. Harap perhatikan bahwa ada banyak jenis jaringan di kelas ConnectivityManager. Juga, jika API> = 21, Anda dapat memeriksa jenis jaringan di kelas NetworkCapabilities.
sumber