Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to respect network use settings in Android

Tags:

android

My app performs some backgound data collection and I'm adding support for the user network preferences, such as performing background updates and data roaming. I have the following checks already:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(cm.getBackgroundDataSetting()) {
...
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) {

with the required entries in the manifest:

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

This all appears to be working fine, but I was wondering if I should be checking anything else? I was worried about checking for data roaming but the docs state that networkInfo.isAvailable() checks this for me. So are there any other checks I need to implement for network settings? Anything else in this area I should be aware of?

like image 766
dave.c Avatar asked Jan 08 '11 15:01

dave.c


2 Answers

The user may change the settings while your background app is running. The API recommends that you listen to the broadcast message:

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

Perhaps you are checking cm.getBackgroundDataSetting() prior to sending data, and I suspect this would be sufficient. However, listening to the broadcast message will let you resume sending background data when the settings are changed.

I believe that either listening to the broadcast message or checking the settings before sending data will suffice. Android docs recommends the former.

like image 55
levis501 Avatar answered Oct 05 '22 01:10

levis501


Additionally to your checks I also do check for roaming state for 3g network:

NetworkInfo info = m_connectivityManager.getActiveNetworkInfo();
int netType = info.getType();
int netSubtype = info.getSubtype();

if (netType == ConnectivityManager.TYPE_WIFI || netType == ConnectivityManager.TYPE_WIMAX)  
{
   //no restrictions, do some networking
}
else if (netType == ConnectivityManager.TYPE_MOBILE && 
     netSubtype == TelephonyManager.NETWORK_TYPE_UMTS)
{
   //3G connection
   if(!m_telephonyManager.isNetworkRoaming())
   {
      //do some networking
   }      
}

My application uses a lot of data, so I do not allow data downloading on non-3g mobile networks.

like image 35
inazaruk Avatar answered Oct 05 '22 02:10

inazaruk