私は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以降では機能しないことを残念に思う