1

この方法でマニフェストで宣言された電話信号強度をリッスンするブロードキャストレシーバーを開発しました

<receiver android:name="it.cazzeggio.android.PhoneStateListener" >
   <intent-filter android:priority="999" >
      <action android:name="android.intent.action.SIG_STR" />
   </intent-filter>
</receiver>

Javaコードは

public class PhoneStateListener extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    Log.e(PhoneStateListener.class.getSimpleName(), new Date().toString());
    try{
       TelephonyManager telephony = (TelephonyManager) 
          context.getSystemService(Context.TELEPHONY_SERVICE);

       //...some checks to be sure that is a gsm-event..

       GsmCellLocation location = (GsmCellLocation) telephony.getCellLocation();
       foundCells.add(0,new String[] {
           telephony.getNetworkOperator() + "_" + location.getLac() + "_" + 
               location.getCid() , ""+(bundle.getInt("GsmSignalStrength")+1)});
       if(!foundCells.isEmpty())
          Functions.CellHistory.addHistory(foundCells);
    }catch (Exception e) {
       Log.e(PhoneStateListener.class.getSimpleName(), e.getMessage(), e);
    }
}

画面がオンの場合はすべて問題ありませんが、電話がスリープモードになるとレシーバーが動作しなくなります (= onReceive メソッドにイベントがディスパッチされません)。

レシーバーをサービスとして登録するか、結果なしで PARTIAL_WAKE_LOCK を使用しようとしました (私は初心者です)。解決策はありますか?

前もって感謝します

4

1 に答える 1

1

わかりました、私が見つけたネットでのグーグルは、未解決のAndroidの問題です.バッテリーを節約するために、画面がオフになっていると、電話は信号強度に関するすべてのリスナーの更新を停止します. なので一旦諦めます。

少なくとも電話が接続されているセルIDを取得するための愚かな回避策を作成します。マニフェストでサービスを定義します

<service android:name="it.cazzeggio.android.util.OffScreenPhoneListener"/>

アプリの起動時にメインアクティビティの onCreate メソッドでサービスが開始されます

startService(new Intent(this, OffScreenPhoneListener.class));

クラス OffScreenPhoneListener では、「onCreate」メソッドがタイマーを開始して、電話基地局のチェックを定期的に繰り返します。

PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
   OffScreenPhoneListener.class.getSimpleName());
if(!wakeLock.isHeld())
   wakeLock.acquire();
timer=new Timer();
timer.schedule(new myTimerTask(), DELAY, DELAY);

myTimerTask は TimerTask を拡張し、そのメソッドには次のものがあります。

TelephonyManager telephony = (TelephonyManager) 
   getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
GsmCellLocation location = (GsmCellLocation) telephony.getCellLocation();
//Adding to my history the following infos:
//  telephony.getNetworkOperator()
//  location.getLac()
//  location.getCid()

onDestroy メソッドは、私が作成したすべてのものを消去します。

super.onDestroy();
timer.cancel();
timer.purge();
if(wakeLock!=null && wakeLock.isHeld())
  wakeLock.release();

とにかくお気遣いありがとうございます。

于 2013-02-24T14:10:54.217 に答える