我有一个PhoneReceiver类,它扩展BroadcastReceiver
我设置手机的个人资料模式
沉默。
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
manager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
当我显示信息日志时
Log.i("tag", "RingerMode: " + context.getRingerMode());
我在日志中得到"RingerMode: 0"
。
问题是,手机会显示静音模式的图标,并在设置菜单中显示为静音。但是当有来电时,会播放铃声。它似乎发生在代码setRingerMode()
被执行之后。据我所知,手机已正确设置为静音模式,但当有来电时,这完全被忽略。
我在Activity中也有相同的代码,当我从那里运行它时工作正常(接到电话时手机是静音的)。这让我相信它与接收器中执行的静音模式代码有关。
手机似乎陷入了忽略静音模式的状态。即使我卸载了我的应用程序,手机也会忽略静音模式。将手机设置为正常模式,然后从我的活动恢复为静音模式,可使手机再次正常工作。 我已经搜索了这种行为的原因了好几天,但我无法弄明白。
这是接收器类
package my.package;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.media.AudioManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.CallLog;
import android.telephony.TelephonyManager;
import android.util.Log;
public class PhoneReceiver extends BroadcastReceiver {
private DbHelperAdapter mDbHelper;
private DbHelperAdapter mDbHelperFive;
private DbHelperAdapter mDbHelperSix;
private static final int RINGER_MODE_SILENT = 0;
private static final int RINGER_MODE_VIBRATE = 1;
private static final int RINGER_MODE_NORMAL = 2;
public static final String PREFS_NAME = "MyPrefsFile";
int indexOfCurrentNumber = 0;
private Context context;
@Override
public void onReceive(Context context, Intent intent) {
RingerMode ringMode = new RingerMode();
Log.i("jens", "RingerMode: "+ringMode.getRingerMode(context));
this.context = context;
Bundle extras = intent.getExtras();
//AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
int incommingcall = 0;
int incommingcallanswered = 0;
incommingcallanswered = prefs.getInt("incommingcallanswered", 0);
incommingcall = prefs.getInt("incommingcall", 0);
//boolean prefCallLogStatus = prefs.getBoolean(SettingsActivity.KEY_PREF_CALLLOG, false);
int prefMissedCallsLimit = prefs.getInt("missedCallInCallLog", 3);
int prefMinutesCallInCallLog = prefs.getInt("minutesCallInCallLog", 3);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
boolean prefCallLogStatus = sp.getBoolean(SettingsActivity.KEY_PREF_CALLLOG, false);
Log.i("jens", "prefCallLogStatus: "+prefCallLogStatus);
Log.i("jens", "prefMissedCallsLimit: "+prefMissedCallsLimit);
//SharedPreferences sharedPref = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
// If there has been an incomming call
if (extras != null) {
String state = extras.getString(TelephonyManager.EXTRA_STATE);
Log.i("jens", "phone state: "+state);
//User ended call
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
if (incommingcall == 1 || incommingcallanswered == 1){
try {
//when Idle i.e no call
//Toast.makeText(context, "Phone state IDLE", Toast.LENGTH_LONG).show();
//SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME,
// Context.MODE_PRIVATE);
int ringermode = 0;
ringermode = prefs.getInt("oldringermode", -1);
RingerMode setR = new RingerMode();
Log.i("jens", "ringermode value: "+ringermode);
//Change profile back to previous state
if (ringermode == RINGER_MODE_NORMAL) {
//AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
manager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
//setR.setRingerMode(context, RINGER_MODE_NORMAL);
//manager.setRingerMode(RINGER_MODE_NORMAL);
}else if (ringermode == RINGER_MODE_SILENT) {
//AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
manager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
//setR.setRingerMode(context, RINGER_MODE_SILENT);
//manager.setRingerMode(RINGER_MODE_SILENT);
}else if (ringermode == RINGER_MODE_VIBRATE) {
//AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
manager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
//manager.setRingerMode(RINGER_MODE_VIBRATE);
}else{
//Failed
Log.e("DEBUG", "Failed to reset ringermode in PhoneReceiver");
}
//Log.i("jens", "Ringermode in IDLE: "+manager.getRingerMode());
//Change shared preference to show not imcomming call
editor.putInt("incommingcall", 0);
editor.putInt("incommingcallanswered", 0);
// Commit the edits!
editor.commit();
} catch (Exception e) {
Log.i("********************************", ""+e);
}
}else{
//If not an incomming call
editor.putInt("incommingcall", 0);
editor.commit();
}
}
else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
Log.i("********************************", "Phone state OFFHOOK");
//Toast.makeText(context, "Phone state OFFHOOK", Toast.LENGTH_LONG).show();
//when Off hook i.e in call
//Make intent and start your service here
incommingcall = prefs.getInt("incommingcall", -1);
//Incomming call or not
if (incommingcall == 1){
editor.putInt("incommingcallanswered", 1);
}else{
editor.putInt("incommingcallanswered", 0);
editor.putInt("incommingcall", 0);
}
// Commit the edits!
editor.commit();
//Toast.makeText(context, "Phone state Off hook", Toast.LENGTH_LONG).show();
}
//Phone is ringing
else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
Log.i("jens", "Phone state RINGING");
mDbHelper = new DbHelperAdapter(context);
try {
String incomingPhoneNumber = extras
.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.i("jens", "bundle number"+incomingPhoneNumber);
//check if phonenumbers is in whitelist in database (phonenumbers table)
mDbHelper.open();
// Check if the calling number is in the white list
Cursor cur = mDbHelper.fetchActiveNormalList(incomingPhoneNumber);
//count to see if the number is in the whitelist
int i = cur.getCount();
// Fetch the index of the Current number
while (cur.moveToNext())
{
indexOfCurrentNumber = cur.getInt(0);
}
cur.close();
mDbHelper.close();
////check if denyphonenumbers is in blacklist in database (denyphonenumbers table)
mDbHelperFive = new DbHelperAdapter(context);
mDbHelperFive.open();
// Check if the calling number is in the white list
Cursor cursorFive = mDbHelperFive.fetchActiveSilentList(incomingPhoneNumber);
//count to see if there is one number in the list
int l = cursorFive.getCount();
cursorFive.close();
mDbHelperFive.close();
////check if denyphonenumbers is in blacklist in database (denyphonenumbers table)
mDbHelperSix = new DbHelperAdapter(context);
mDbHelperSix.open();
// Check if the calling number is in the white list
Cursor cursorSix = mDbHelperSix.fetchActiveVibrateList(incomingPhoneNumber);
//count to see if there is one number in the list
int m = cursorSix.getCount();
cursorSix.close();
mDbHelperSix.close();
Log.i("jens", "VALUE of i: "+i);
int listStatus = 0;
if (i > 0){
//Number exists in whitelist
listStatus = 1;
}else if (l > 0){
//Number exists in blacklist
listStatus = 2;
}else if (m > 0){
//Number exists in blacklist
listStatus = 3;
}
if (listStatus == 0){
// Call log checkbox is checked in preferences
if (prefCallLogStatus == true){
listStatus = 4;
}
}
Log.i("jens", "VALUE of listStatus: "+listStatus);
int oldringermode;
RingerMode setR = new RingerMode();
switch (listStatus) {
//case 0:
// Log.i("jens", "Case 0");
// Number exists in whiteList
case 1:
Log.i("jens", "Case 1 Normal : "+i);
//Store old ringermode value in shared preference
oldringermode = setR.getRingerMode(context);
editor.putInt("oldringermode", oldringermode);
editor.putInt("incommingcall", 1);
// Commit the edits!
editor.commit();
// Change ringermode to allow sound
setR.setRingerMode(context, RINGER_MODE_NORMAL);
break;
// Number set to silent
case 2:
Log.i("jens","Case 2 Silent ");
oldringermode = setR.getRingerMode(context);
editor.putInt("oldringermode", oldringermode);
editor.putInt("incommingcall", 1);
// Commit the edits!
editor.commit();
// Change ringermode to block sound
setR.setRingerMode(context, RINGER_MODE_SILENT);
//manager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
break;
// Number set to vibrate
case 3:
//number set to vibrate
Log.i("jens","Case 3 Vibrate ");
oldringermode = setR.getRingerMode(context);
editor.putInt("oldringermode", oldringermode);
editor.putInt("incommingcall", 1);
// Commit the edits!
editor.commit();
// Change ringermode to block sound
setR.setRingerMode(context, RINGER_MODE_VIBRATE);
//manager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
break;
// Number does not exist in white or black list
case 4:
Log.i("jens", "Case 4 ");
//int minutes = 3; // The number of minutes to be fetched from the callLog
long timestamp = System.currentTimeMillis();
timestamp = timestamp - (60000 * prefMinutesCallInCallLog); // The number of minutes to be fetched from the callLog
String projection[] = new String[] {CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DATE };
String selection = CallLog.Calls.NUMBER+" = '" + incomingPhoneNumber +"' AND " + CallLog.Calls.DATE + " > "+ timestamp + " " ;
//String selectionArgs[] = new String[] { (String.valueOf(CallLog.Calls.INCOMING_TYPE)) , (resetDate) };
Log.i("jens", "selection: "+selection);
// Fetch last three minutes from callLog
Cursor managedCursor = context.getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, projection,
selection , null, null);
int responseCount = managedCursor.getCount();
Log.i("jens","responseCount: "+responseCount);
Log.i("jens","prefMissedCallsLimit: "+prefMissedCallsLimit);
// If there is more than X calls in callLog
if (responseCount > (prefMissedCallsLimit-1))
{
Log.i("jens","responseCount > (prefMissedCallsLimit-1) setting normal" );
oldringermode = setR.getRingerMode(context);
editor.putInt("oldringermode", oldringermode);
editor.putInt("incommingcall", 1);
// Commit the edits!
editor.commit();
// Change ringermode to block sound
setR.setRingerMode(context, RINGER_MODE_NORMAL);
//manager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
}
break;
default: listStatus = 0;
Log.i("jens", "No Case");
break;
}
} catch (Exception e) {
// TODO Auto-generated catch block
Log.i("jens", ""+e);
}
mDbHelper.close();
Log.i("jens", "Phone state RINGING stopped");
}
}
}
}