0

私はAndroid開発に不慣れです。デバイスが着信に自動的に応答するかどうかを切り替えるボタンを備えたウィジェットを開発しようとしています。

AppWidgetProviderを拡張するクラスを作成することから始めました。SharedPreferencesを使用してウィジェットボタンの状態を保存しています。OnReceive(Context、Intent)メソッドでは、インテントを使用して、BroadcastReceiverを登録して電話の状態の変更をリッスンするIntentServiceを開始しています。ただし、ウィジェットがオフになっているときにBroadcastReceiverの登録を解除する方法がわからないようです。私のコードは、ウィジェットボタンの状態に関係なく、電話の状態を監視し続けます。出来ますか?または、PhoneStateListenerを停止する別の方法はありますか?

ありがとう。

更新:コードの改訂は次のとおりです

マニフェスト:android.intent.action.PHONE_STATEインテントフィルターを使用してBroadcastReceiverをマニフェストに配置しました

AppWidgetProviderの場合:

ComponentName componentName = new ComponentName(context, PhoneStateBroadcastReceiver.class);

//use to enable the broadcast receiver
packageManager.setComponentEnabledSetting(componentName, 
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

//use to disable the broadcast receiver
packageManager.setComponentEnabledSetting(componentName, 
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

BroadcastReceiverの場合:

@Override
public void onReceive(Context context, Intent intent) {

    //check call state
    TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    if(tm.getCallState()==TelephonyManager.CALL_STATE_RINGING){
        try{

            //wait 2 seconds then answer the call
            Thread.sleep(2000);
            Class c = Class.forName(tm.getClass().getName());
            Method m = c.getDeclaredMethod("getITelephony");
            m.setAccessible(true);
            ITelephony telephony = (ITelephony)m.invoke(tm);
            telephony.silenceRinger();
            telephony.answerRingingCall();

        } catch(Exception e){}
    }

}

PhoneStateListenerは必要ありません...

これは2.3以降では機能しないことを残念に思う

4

1 に答える 1

1

インテントを使用して、BroadcastReceiverを登録して電話の状態の変更をリッスンするIntentServiceを開始しています

これは確実に機能しません。IntentService終了すると、プロセスが終了し、終了する可能性BroadcastReceiverがあるためです。BroadcastReceiverマニフェストに電話の状態を入れてください。

ただし、ウィジェットがオフになっているときにBroadcastReceiverの登録を解除する方法がわからないようです。

PackageManagerおよびを使用setComponentEnabledSetting()して、マニフェストに配置する電話状態レシーバーを有効または無効にします。

また、ここで行っているように、イベントリスナーを登録するなど、BroadcastReceiver過去に存在するものから確実に何かを行うことはできません。onReceive()

于 2011-12-22T21:11:41.143 に答える