簡體   English   中英

Android:網絡連接檢查始終失敗

[英]Android: Network connectivity check always fail

在我的應用程序中,有一個具有天氣活動的模塊。 當用戶單擊並激活天氣功能時,將檢查網絡連接。 問題是,直接啟動后,我的吐司消息“無網絡連接”隨Android對話框一起啟用。

當用戶單擊“啟用”時,選項中沒有任何要激活的內容(所有功能均處於啟用狀態)。 當用戶單擊“取消”時,對話框消失,應用程序正在運行。

這是我從活動中獲得的代碼:

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

@Override
public void onStart() {
    super.onStart();
    EasyTracker.getInstance(this).activityStart(this);
    // Connect the client.
    mLocationClient.connect();

    // Registers BroadcastReceiver to track network connection changes.
    mNetworkReceiver = new NetworkReceiver() {
        private MyAlertDialog enableNetworkDialog = null;

        @Override
        public void onNoConnectivity() {
            Toast.makeText(MainActivity.this,
                    getString(R.string.network_disabled), Toast.LENGTH_LONG)
                    .show();

            // If the dialog already prompted, do nothing
            if (enableNetworkDialog != null
                    && enableNetworkDialog.isShowing())
                return;

            // Prompt a dialog for user to open the network settings screen
            enableNetworkDialog = new MyAlertDialog(MainActivity.this,
                    null, getString(R.string.network_disabled), false);
            enableNetworkDialog.setPositiveButton("Enable",
                    new OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            toggleNetworkSourceSetting();
                        }
                    });
            enableNetworkDialog.setNegativeButton("Cancel",
                    new OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            dialog.dismiss();
                        }
                    });
            enableNetworkDialog.show();
        }

        @Override
        public void onConnect() {
            if (enableNetworkDialog != null
                    && enableNetworkDialog.isShowing())
                enableNetworkDialog.dismiss();
        }

        @Override
        public void onNetworkChange() {
        }

        @Override
        public void onReconnect() {
        }
    };
}

更新:這是我的清單:

 <!-- Grant the network access permission -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

這是我的logcat的摳圖:

[ 07-19 10:43:17.876 18037:18037 D/         ]
                                                              Current Network Info : NetworkInfo: type: mobile_supl[HSPA+, type_ext: mobile_supl], state: DISCONNECTED/DISCONNECTED, reason: dataDisabled, extra: internet.telekom, roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false, isIpv4Connected: false, isIpv6Connected: false

[ 07-19 10:43:17.876 18037:18037 D/         ]
                                                              No network is available

07-19 10:43:19.778 18037-18037/bakteriusdeveloper.master D/Network Connection: mobile is available

更新超級方法:

    /**
 * The subclass of the BroadcastReeiver is used to detect the change of
 * connectivity.
 * 
 */
public class NetworkReceiver extends BroadcastReceiver {

    public NetworkReceiver() {
        super();
    }

    public void onNoConnectivity() {
    };

    public void onNetworkChange() {
    };

    public void onConnect() {
    };

    public void onReconnect() {
    };

    public void toggleNetworkSourceSetting() {
        startActivity(new Intent(
                android.provider.Settings.ACTION_WIRELESS_SETTINGS));
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager conn = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activNetworkInfo = conn.getActiveNetworkInfo();

        String failMessage = intent
                .getStringExtra(ConnectivityManager.EXTRA_REASON);
        Logger.printMessage(getClass().getSimpleName(), failMessage,
                Logger.DEBUG);
        Boolean isNoConnectivity = intent.getBooleanExtra(
                ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        Boolean isFailOver = intent.getBooleanExtra(
                ConnectivityManager.EXTRA_IS_FAILOVER, false);
        Logger.printMessage(getClass().getSimpleName(), "is Failover: "
                + isFailOver, Logger.DEBUG);
        Boolean isNetworkChanged = false;

        NetworkInfo otherNetworkInfo = (NetworkInfo) intent
                .getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);
        NetworkInfo networkInfo = (NetworkInfo) intent
                .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

        Logger.printMessage(getClass().getSimpleName(),
                "Current Network Info : " + networkInfo, Logger.DEBUG);
        Logger.printMessage(getClass().getSimpleName(),
                "Other Network Info : " + otherNetworkInfo, Logger.DEBUG);

        if (networkInfo != null && networkInfo.isConnected()) {
            if (isFailOver) {
                Logger.printMessage(getClass().getSimpleName(),
                        "Network is re-connected and available now",
                        Logger.DEBUG);
                onReconnect();
                return;
            } else {
                Logger.printMessage(getClass().getSimpleName(),
                        "Network is available", Logger.DEBUG);
                onConnect();
                return;
            }

        } else if (networkInfo != null
                && !networkInfo.isConnectedOrConnecting()) {
            // do application-specific task(s) based on the current network
            // state, such
            // as enabling queuing of HTTP requests when currentNetworkInfo
            // is connected etc.
            if (otherNetworkInfo != null
                    && otherNetworkInfo.isConnectedOrConnecting()) {
                isNetworkChanged = true;
            } else {
                Logger.printMessage(getClass().getSimpleName(),
                        "No network is available", Logger.DEBUG);
                onNoConnectivity();
                return;
            }
        }

        // No network is active OR no network is available
        if (activNetworkInfo == null || isNoConnectivity) {
            if (isNetworkChanged) {
                Logger.printMessage(getClass().getSimpleName(),
                        "Change network connectivity", Logger.DEBUG);
                onNetworkChange();
                return;
            } else {
                Logger.printMessage(getClass().getSimpleName(),
                        "No network is available", Logger.DEBUG);
                onNoConnectivity();
                return;
            }
        }
    }
}

我的要求出了什么問題? 有任何想法嗎?

您可以在onResume而不是onStart中注冊NetworkReceiver並檢查其是否有效

確保在AndroidManifest.xml中添加了網絡權限:

<uses-permission android:name="android.permission.INTERNET" />

在清單中注冊一個廣播接收器:

<receiver
            android:name=".NetworkReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
</receiver>

然后是NetworkReceiver類:

public class NetworkReceiver extends BroadcastReceiver {

    private static volatile boolean connected;

    @Override
    public void onReceive(final Context context, final Intent intent) {
        Log.d("Network", "Network changed");
        if (intent.getExtras() != null) {
            update();
        }
    }

    public static void update() {
        ConnectivityManager connectivityManager = (ConnectivityManager) ApplicationLoader
                .applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        connected = networkInfo != null && networkInfo.isConnected();
    }

    public static boolean isConnected() {
        return connected;
    }
}

然后,如果您要檢查網絡狀態調用:

NetworkReceiver.update(); // Updates network status
if (NetworkReceiver.isConnected()) {
    // do whatever you want.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM