ツールクラス--ネットワーク関連

41296 ワード

目次
  • 通常ネットワーク状態検出
  • の2つの方式は、ブロードキャスト傍受ネットワークの状態変化
  • によって変化する.
  • 方式一、放送+普通コールバック
  • 方式二、放送+LiveData
  • 一般的なネットワーク状態検出
  • 携帯電話がネットワークに接続するかどうかを判断する
  • デバイスがwifi接続するかどうかを判断する
  • デバイスがデータ接続するか否かを判断する
  • .
  • イーサネット接続かどうかを判断
  • 取得装置ip
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    
    import cc.catface.ctool.context.TContext;
    
    public class TNetwork {
    
        /**            */
        public static boolean isNetAvail() {
            ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (null == manager) return false;
            NetworkInfo info = manager.getActiveNetworkInfo();
            return null != info && info.isAvailable();
        }
    
        /*       wifi   */
        public static boolean isWIFI() {
            ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (null == manager) return false;
            NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            return null != networkInfo && networkInfo.isConnected();
        }
    
        /*            */
        public static boolean isMobile() {
            ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (null == manager) return false;
            NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_DUN);
            return null != networkInfo && networkInfo.isConnected();
        }
    
        /*           */
        public static boolean isEthernet() {
            ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (null == manager) return false;
            NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET);
            return null != networkInfo && networkInfo.isConnected();
        }
    
    
        /** ip */
        public static String getIp() {
            WifiManager wifiManager = (WifiManager) TContext.getContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            if (null == wifiManager) return "";
            WifiInfo connectionInfo = wifiManager.getConnectionInfo();
            return convertIp(connectionInfo.getIpAddress());
        }
    
        private static String convertIp(int ip) {
            return (ip & 0xff) + "." + ((ip >> 8) & 0xff) + "." + ((ip >> 16) & 0xff) + "." + ((ip >> 24) & 0xff);
        }
    }
    
  • 2つの方式は、ブロードキャストによるネットワーク状態の変化を傍受する
    使用方法2、簡単で使いやすい
    方式一、放送+普通コールバック
  • ネットワークブロードキャスト
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.net.ConnectivityManager;
    
    public class NetBroadcastReceiver extends BroadcastReceiver {
        private NetEventListener mListener;
    
        @Override public void onReceive(Context context, Intent intent) {
            if (null == intent || null == intent.getAction()) {
                mListener.onNetChange(NetStateUtil.NETWORK_NONE);
                return;
            }
    
            if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                int netWorkType = NetStateUtil.getNetWorkType();
                mListener.onNetChange(netWorkType);
            }
        }
    
        public interface NetEventListener {
            void onNetChange(int netWorkType);
        }
    
        public void setListener(NetEventListener listener) {
            if (null != listener) this.mListener = listener;
        }
    }
    
  • アシストツールクラス
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    
    import cc.catface.ctool.context.TContext;
    
    public class NetStateUtil {
        public static final int NETWORK_NONE = -1;  //    
        public static final int NETWORK_MOBILE = 0; //     
        public static final int NETWORK_WIFI = 1;   //     
    
        public static int getNetWorkType() {
            int result = NETWORK_NONE;
    
            ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            if (null == manager) return NETWORK_NONE;
            NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
            if (null == activeNetworkInfo || !activeNetworkInfo.isConnected()) return result;
            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) result = NETWORK_WIFI;
            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE))
                result = NETWORK_MOBILE;
    
            return result;
        }
    }
    ``
    
    
  • 使用方式
    //                      
    mReceiver = new NetBroadcastReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    mActivity.registerReceiver(mReceiver, filter);
    mReceiver.setListener(netWorkType -> {
        String netState = "     ";
        if (NetStateUtil.NETWORK_WIFI == netWorkType) {
            netState = "wifi";
        } else if (NetStateUtil.NETWORK_MOBILE == netWorkType) {
            netState = "    ";
        }
        mBinding.tiNetState.setContent("      :" + netState);
    });
    
    //      
    @Override public void onDestroy() {
        super.onDestroy();
        if (null != mReceiver) mActivity.unregisterReceiver(mReceiver);
    }
    

  • 方式二、放送+LiveData
  • ライブデータをカスタマイズし、内部の放送結果により現在のライブデータの値
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    
    import androidx.lifecycle.LiveData;
    
    import java.lang.ref.WeakReference;
    
    public class NetworkLiveData extends LiveData<NetworkInfo> {
    
    
        private final WeakReference<Context> mWeakContext;
        private static NetworkLiveData mNetworkLiveData;
        private NetworkReceiver mReceiver;
        private final IntentFilter mFilter;
    
    
        private NetworkLiveData(WeakReference<Context> context) {
            mWeakContext = context;
            mReceiver = new NetworkReceiver();
            mFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        }
    
        public static NetworkLiveData getInstance(WeakReference<Context> context) {
            if (null == mNetworkLiveData) {
                synchronized (NetworkLiveData.class) {
                    if (null == mNetworkLiveData) {
                        mNetworkLiveData = new NetworkLiveData(context);
                    }
                }
            }
    
            return mNetworkLiveData;
        }
    
    
        @Override protected void onActive() {
            super.onActive();
            mWeakContext.get().registerReceiver(mReceiver, mFilter);
        }
    
        @Override protected void onInactive() {
            super.onInactive();
            mWeakContext.get().unregisterReceiver(mReceiver);
        }
    
    
        private static class NetworkReceiver extends BroadcastReceiver {
            @Override public void onReceive(Context context, Intent intent) {
                ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                if (null == manager) return;
                NetworkInfo info = manager.getActiveNetworkInfo();
                getInstance(new WeakReference<>(context)).setValue(info);
            }
        }
    }
    
  • を設定.
  • 使用形態
    NetworkLiveData.getInstance(new WeakReference<>(mActivity)).observe(mActivity, new Observer<NetworkInfo>() {
       @Override public void onChanged(NetworkInfo networkInfo) {
           TLog.d(getClass().getName() + "-->networkInfo: " + networkInfo);
       }
    });