亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Android 上選擇/強制使用移動數據(或 wifi)進行網絡通話?

如何在 Android 上選擇/強制使用移動數據(或 wifi)進行網絡通話?

ibeautiful 2023-03-09 10:28:28
我有一個瘋狂的用戶案例,要求僅通過移動數據 (SIM) 調用某些 REST 服務。我們想通過 wifi 發送其余數據。Android上是否可以強制通過哪種網絡發送數據?是否可以在同一個應用程序和同一個會話中通過移動數據發送一些數據并通過 wifi 發送其他數據?另外,測試呼叫是否通過正確的網絡類型發送的最佳方法是什么?
查看完整描述

2 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

我的使用:


@TargetApi(21)

private fun getMobileNetWork() {

    connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val builder = NetworkRequest.Builder()

    builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)

    builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)//TRANSPORT_WIFI

    val build = builder.build()

    connectivityManager!!.requestNetwork(build, networkCallback)

}



val networkCallback = object : ConnectivityManager.NetworkCallback() {

    override fun onAvailable(network: Network) {

        super.onAvailable(network)

        //Use the network to do your thing

    }


    override fun onLost(network: Network?) {

        super.onLost(network)

    }

    override fun onUnavailable() {

        super.onUnavailable()

    }

}

okhttp3中的網絡使用:


    val builder = OkHttpClient.Builder()

            .connectTimeout(15L, TimeUnit.SECONDS)

            .readTimeout(20L, TimeUnit.SECONDS)

            .writeTimeout(15L, TimeUnit.SECONDS)

            .socketFactory(network.socketFactory)

            .dns {

                network.getAllByName(it).asList()

            }


查看完整回答
反對 回復 2023-03-09
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

您可以使用 ConnectivityManager 檢查哪種網絡類型可用,如果 wifi 已連接,請調用您的 api,否則向用戶顯示對話框以通知他此 api 需要打開 wifi 或相反。


您可以使用 Connectivity 類來檢查網絡


public class Connectivity {


public static NetworkInfo getNetworkInfo(Context context){

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

    return cm.getActiveNetworkInfo();

}



public static boolean isConnected(Context context){

    NetworkInfo info = Connectivity.getNetworkInfo(context);

    return (info != null && info.isConnected());

}


public static boolean isConnectedWifi(Context context){

    NetworkInfo info = Connectivity.getNetworkInfo(context);

    return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);

}


public static boolean isConnectedMobile(Context context){

    NetworkInfo info = Connectivity.getNetworkInfo(context);

    return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);

}


public static boolean isConnectedFast(Context context){

    NetworkInfo info = Connectivity.getNetworkInfo(context);

    return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype()));

}


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;

    }

}

}


檢查可用的網絡類型


if (isConnectedWifi(ctx) {

        // Call api

    }else if (isConnectedMobile(ctx)){

       // Show dialog to user to inform him that this api required open wifi

    }else{

       //

    }


查看完整回答
反對 回復 2023-03-09
  • 2 回答
  • 0 關注
  • 293 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號