Wi-Fi가 Android에 연결되어 있는지 어떻게 알 수 있습니까?
사용자가 Wi-Fi에 연결되어 있지 않은 경우 다운로드를 시도하지 않기를 바랍니다. 그러나 Wi-Fi가 활성화되어 있는지 여부 만 알 수 있지만 3G 연결은 여전히 가능합니다.
android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE);
android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState();
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s);
if (state != NetworkInfo.DetailedState.CONNECTED) {
return false;
}
그러나 국가는 내가 기대하는 것이 아닙니다. Wi-Fi가 연결되어 있지만 OBTAINING_IPADDR
상태로 표시됩니다.
ConnectivityManager를 사용하여 Wi-Fi 어댑터의 상태를 얻을 수 있어야합니다. 여기에서 연결되어 있거나 사용 가능한지 확인할 수 있습니다 .
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWifi.isConnected()) {
// Do whatever
}
참고 : 추가 해야한다는 점에 유의해야합니다 (여기서는 n00bies).
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
너의 ~에게
이것이 작동하려면 AndroidManifest.xml .
NOTE2 : public NetworkInfo getNetworkInfo (int networkType)
이제 더 이상 사용되지 않습니다 :
이 방법은 API 레벨 23에서 더 이상 사용되지 않습니다.이 방법은 동일한 유형의 여러 연결된 네트워크를 지원하지 않습니다. 대신 getAllNetworks () 및 getNetworkInfo (android.net.Network)를 사용하십시오.
NOTE3 : public static final int TYPE_WIFI
이제 더 이상 사용되지 않습니다 :
이 상수는 API 레벨 28에서 더 이상 사용되지 않습니다. 대신 응용 프로그램은 NetworkCapabilities.hasTransport (int) 또는 requestNetwork (NetworkRequest, NetworkCallback)를 사용하여 적절한 네트워크를 요청해야합니다. 지원되는 전송 용.
방법 때문에 NetworkInfo.isConnected ()는 이제 중단 에 API-23 , 여기에 무선 인터넷 어댑터에 있고 대신 WifiManager를 사용하는 액세스 포인트에 접속하는 경우를 검출하는 방법이다 :
private boolean checkWifiOnAndConnected() {
WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
if( wifiInfo.getNetworkId() == -1 ){
return false; // Not connected to an access point
}
return true; // Connected to an access point
}
else {
return false; // Wi-Fi adapter is OFF
}
}
나는 단순히 다음을 사용합니다.
SupplicantState supState;
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
getSupplicantState ()를 호출 할 때 이러한 상태 중 하나를 반환합니다.
ASSOCIATED-연결 완료
ASSOCIATING-액세스 포인트와 연결하려고합니다.
완료-모든 인증이 완료되었습니다.
DISCONNECTED-이 상태는 클라이언트가 연결되어 있지 않지만 액세스 포인트를 찾기 시작할 가능성이 있음을 나타냅니다.
DORMANT-클라이언트가 명시 적 DISCONNECT 명령을 실행할 때보고되는 Android 추가 상태입니다.
FOUR_WAY_HANDSHAKE-WPA 4 방향 키 핸드 셰이크가 진행 중입니다.
GROUP_HANDSHAKE-WPA 그룹 키 핸드 셰이크가 진행 중입니다.
비활성-비활성 상태.
INVALID-일반적으로 볼 수없는 의사 상태입니다.
스캔-네트워크 스캔.
UNINITIALIZED-연결되지 않았습니다.
활성 네트워크가 Wi-Fi인지 확인하기 위해 내 앱에서 이것을 사용하고 있습니다.
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI)
{
// Do your work here
}
나는 이와 같은 몇 가지 질문을 살펴보고 이것을 생각해 냈습니다.
ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isConnected()){
// If Wi-Fi connected
}
if (mobile.isConnected()) {
// If Internet connected
}
Root Toolbox PRO에서 라이센스 확인을 위해 if를 사용하는데 훌륭하게 작동하는 것 같습니다.
하지만 제이슨의 대답은 정확한지, 요즘 getNetWorkInfo (INT)는 사용되지 않는 방법이다. 따라서 다음 함수는 좋은 대안이 될 것입니다.
public static boolean isWifiAvailable (Context context)
{
boolean br = false;
ConnectivityManager cm = null;
NetworkInfo ni = null;
cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
ni = cm.getActiveNetworkInfo();
br = ((null != ni) && (ni.isConnected()) && (ni.getType() == ConnectivityManager.TYPE_WIFI));
return br;
}
사용 WifiManager
당신이 할 수 있습니다 :
WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}
getNeworkId 메소드 는 네트워크에 연결되지 않은 경우에만 -1을 리턴합니다.
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
boolean is3g = manager.getNetworkInfo(
ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifi = manager.getNetworkInfo(
ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
Log.v("", is3g + " ConnectivityManager Test " + isWifi);
if (!is3g && !isWifi) {
Toast.makeText(
getApplicationContext(),
"Please make sure, your network connection is ON ",
Toast.LENGTH_LONG).show();
}
else {
// Put your function() to go further;
}
이 방법을 사용해보십시오.
public boolean isInternetConnected() {
ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
boolean ret = true;
if (conMgr != null) {
NetworkInfo i = conMgr.getActiveNetworkInfo();
if (i != null) {
if (!i.isConnected()) {
ret = false;
}
if (!i.isAvailable()) {
ret = false;
}
}
if (i == null)
ret = false;
} else
ret = false;
return ret;
}
이 방법은 사용 가능한 인터넷 연결을 찾는 데 도움이됩니다.
이것은 나를 위해 작동합니다 :
ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// Mobile
State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
// Wi-Fi
State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
// And then use it like this:
if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING)
{
Toast.makeText(Wifi_Gprs.this,"Mobile is Enabled :) ....",Toast.LENGTH_LONG).show();
}
else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING)
{
Toast.makeText(Wifi_Gprs.this,"Wifi is Enabled :) ....",Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(Wifi_Gprs.this,"No Wifi or Gprs Enabled :( ....",Toast.LENGTH_LONG).show();
}
이 권한을 추가하십시오.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
다음은 내 앱에서 유틸리티 방법으로 사용하는 것입니다.
public static boolean isDeviceOnWifi(final Context context) {
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return mWifi != null && mWifi.isConnectedOrConnecting();
}
새 버전의 Android
private void getWifiInfo(Context context) {
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] networks = connManager.getAllNetworks();
if(networks == null || networks.length == 0)
return;
for( int i = 0; i < networks.length; i++) {
Network ntk = networks[i];
NetworkInfo ntkInfo = connManager.getNetworkInfo(ntk);
if (ntkInfo.getType() == ConnectivityManager.TYPE_WIFI && ntkInfo.isConnected() ) {
final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
if (connectionInfo != null) {
// add some code here
}
}
}
}
선입관도 추가하십시오
@Jason Knight와 비슷하지만 Kotlin 방식으로 :
val connManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
if (mWifi.isConnected) {
// Do whatever
}
이것은 더 쉬운 해결책입니다. Android에서 스택 오버플로 질문 Wi-Fi 사용 여부 확인을 참조하십시오 .
PS 권한을 허용하기 위해 manifest.xml 파일에 코드를 추가하는 것을 잊지 마십시오. 아래 그림과 같이.
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
시험
wifiManager.getConnectionInfo().getIpAddress()
장치가 사용 가능한 연결 (내 컴퓨터, Samsung SM-T280, Android 5.1.1)이 될 때까지 0을 반환합니다.
다음과 같이 활성화되지 않은 경우 WIFI를 켤 수 있습니다. @Jason Knight가 응답 한 WIFI 상태를 확인하십시오. 2. 활성화되지 않은 경우 매니페스트 파일에 WIFI 권한을 추가하는 것을 잊지 마십시오
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
당신의 자바 클래스는
public class TestApp extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//check WIFI activation
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWifi.isConnected() == false) {
showWIFIDisabledAlertToUser();
}
else {
Toast.makeText(this, "WIFI is Enabled in your devide", Toast.LENGTH_SHORT).show();
}
}
private void showWIFIDisabledAlertToUser(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("WIFI is disabled in your device. Would you like to enable it?")
.setCancelable(false)
.setPositiveButton("Goto Settings Page To Enable WIFI",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
Intent callGPSSettingIntent = new Intent(
Settings.ACTION_WIFI_SETTINGS);
startActivity(callGPSSettingIntent);
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
dialog.cancel();
}
});
AlertDialog alert = alertDialogBuilder.create();
alert.show();
}
}
많은 답변이 더 이상 사용되지 않는 코드 또는 더 높은 API 버전에서 사용 가능한 코드를 사용합니다. 이제 나는 이런 것을 사용합니다
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager != null) {
for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(net);
if (nc != null && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
&& nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
return true;
}
}
return false;
다음 코드 (Kotlin)는 API 21부터 최신 API 버전 (API 29)까지 작동합니다. getWifiState () 함수는 WiFi 네트워크 상태에 대해 열거 형 클래스에 정의 된 Disable, EnabledNotConnected 및 Connected의 3 가지 값 중 하나를 반환합니다. 이를 통해 사용자에게 WiFi를 활성화하거나 이미 활성화 된 경우 사용 가능한 네트워크 중 하나에 연결하도록 알리는 등의 세부적인 결정을 내릴 수 있습니다. 그러나 필요한 모든 것이 WiFi 인터페이스가 네트워크에 연결되어 있는지 여부를 나타내는 부울이면 isWifiConnected () 함수가이를 제공합니다. 이전 항목을 사용하고 결과를 연결됨과 비교합니다.
이전 답변 중 일부에서 영감을 얻었지만 Android API의 진화 또는 천천히 증가하는 IP V6의 가용성으로 인한 문제를 해결하려고합니다. 트릭은 다음을 사용하는 것이 었습니다.
wifiManager.connectionInfo.bssid != null
대신에:
- getIpAddress () == 0 IP V4에만 유효하거나
- getNetworkId () == -1 이제 다른 특수 권한이 필요합니다 (Location)
설명서에 따르면 https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid 네트워크에 연결되어 있지 않으면 null을 반환합니다. 실제 값을 얻을 권한이 없어도 연결되어 있으면 null 이외의 값을 반환합니다.
또한 다음 사항에 유의하십시오.
android.os.Build.VERSION_CODES # N 이전 릴리스에서이 객체는 호출 프로세스 내에서 메모리 누수를 피하기 위해 다른 파생 된 컨텍스트가 아닌 Context # getApplicationContext ()에서만 가져와야합니다.
매니페스트에서 다음을 추가하는 것을 잊지 마십시오.
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
제안 된 코드는 다음과 같습니다.
class MyViewModel(application: Application) : AndroidViewModel(application) {
// Get application context
private val myAppContext: Context = getApplication<Application>().applicationContext
// Define the different possible states for the WiFi Connection
internal enum class WifiState {
Disabled, // WiFi is not enabled
EnabledNotConnected, // WiFi is enabled but we are not connected to any WiFi network
Connected, // Connected to a WiFi network
}
// Get the current state of the WiFi network
private fun getWifiState() : WifiState {
val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
return if (wifiManager.isWifiEnabled) {
if (wifiManager.connectionInfo.bssid != null)
WifiState.Connected
else
WifiState.EnabledNotConnected
} else {
WifiState.Disabled
}
}
// Returns true if we are connected to a WiFi network
private fun isWiFiConnected() : Boolean {
return (getWifiState() == WifiState.Connected)
}
}
참고 URL : https://stackoverflow.com/questions/3841317/how-do-i-see-if-wi-fi-is-connected-on-android
'Programing' 카테고리의 다른 글
명령 줄 매개 변수를 구문 분석하는 가장 좋은 방법은 무엇입니까? (0) | 2020.04.15 |
---|---|
Java Server Faces 2.0의 주요 단점은 무엇입니까? (0) | 2020.04.15 |
YouTube 동영상 퍼가기 (0) | 2020.04.15 |
열거 형 항목의 이름을 얻는 방법? (0) | 2020.04.15 |
키보드 단축키는 Resharper가 설치된 Visual Studio에서 활성화되지 않습니다 (0) | 2020.04.15 |