2011-01-08 13 views
11

アプリでバックグラウンドデータの収集を行い、バックグラウンド更新やデータローミングの実行などのユーザーネットワーク設定のサポートを追加しています。私はすでに、次のチェックを持っている:マニフェストで必要なエントリを持つAndroidのネットワーク使用設定を尊重する方法

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

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

これは、すべてが正常に動作しているように見えるが、私は何かをチェックする必要がある場合、私は不思議でしたか?私はデータローミングのチェックについて心配していましたが、docsの状態でnetworkInfo.isAvailable()がこれをチェックしています。ネットワーク設定のために実装する必要がある他のチェックはありますか?私が知っておくべきこのエリアの他のものは何ですか?

+0

良い質問。ネットワーク情報にはisRoamingメソッドもありません。 (そして、ネットワークプロトコルが異なる可能性があるので、これが問題になる可能性がある場合は、北米地域のみにアプリを開発していますか?) –

+0

はい、isRoaming()メソッドがあります。ネットワークがローミング中で、ユーザがデータローミングを無効にしている場合、 'networkInfo.isAvailable()'が 'false'を返すように見える限り使用していません。このアプリは英国のみです - 私は**これは私がこれまでに持っているコードには影響しているとは思っていませんが、回答の中にいくつかのチェックを実装すると、別のNETWORK_TYPE 。 –

+0

私は好奇心が強いです。私はソースコードとドキュメントを参照しました。 isNetworkAvilableは、あなたがホームネットワークにいるかどうかをチェックするので、信頼できるものです。 (結局、失敗した場合、あなたのアプリケーションだけが問題になるわけではありません;)) –

答えて

6

ユーザーは、バックグラウンドアプリの実行中に設定を変更することがあります。 APIを使用すると、ブロードキャストメッセージに耳を傾けることをお勧めします。

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

はおそらく、あなたがデータを送信する()前cm.getBackgroundDataSettingをチェックしている、と私は、これは十分であろうと思います。ただし、ブロードキャストメッセージを受信すると、設定が変更されたときにバックグラウンドデータの送信が再開されます。

ブロードキャストメッセージを聞いたり、データを送信する前に設定を確認するだけで十分です。 Android docsは前者を推奨します。

+0

私はダウンロードを実行するために 'BroadcastReceiver'を拡張したクラスを持っています。次に、 'AlarmManager'を使用してアラームを設定し、バックグラウンドダウンロードを開始します。レシーバがトリガされるたびに、私のポストでチェックが行われます。あなたが提案したブロードキャストメッセージを聞いて、バックグラウンドアップデートがオフになってすぐにオンになった場合、すぐにダウンロードを開始できるようにすることもできます。それとも、次回のダウンロードが行われるのを待つことができます。私はデザインの決定をしなければならないと思う...ポストのおかげで。 –

6

さらにあなたのチェックに私はまた、3Gネットワ​​ークの状態をローミングするためにチェックします:

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 
    }  
} 

私のアプリケーションは、大量のデータを使用していますので、私はデータが非3Gモバイルネットワークでダウンロードすることはできません。

+0

面白いアプローチ、ポストのおかげで。 '!m_telephonyManager.isNetworkRoaming()'はユーザがデータローミングを許可するためにボックスにチェックを入れていてもダウンロードを防止しませんか? –

+0

設定で「データローミング」にチェックを入れていないと、誰もローミング中にモバイルネットワークを使用できなくなります。しかし、私の場合は、ローミングが有効になっていても、ネットワークの使用量が多くなるのを防ぐ必要がありました(軽い要求の場合、私はこのローミングチェックをしませんでした)。したがって、デバイスワイズローミングが有効になっていても、アプリケーションのネットワークアクティビティが無効になります。 – inazaruk

2

@inazarukと同様に、私はGPRSのみで画像をローミングまたはダウンロードするときに(おそらく高価な)ネットワーク転送を防止しようともしています。したがって、Zwitscherでは、私は、ローマ字化と最小限のネットワーク状態でユーザーの設定をチェックするNetworkHelperを実装しました。 https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/helper/NetworkHelper.java 一致する環境設定は次のとおりです。https://github.com/pilhuhn/ZwitscherA/blob/master/res/xml/preferences.xml#L30

関連する問題