Android 当安卓手机处于铃声模式时,手机会播放铃声

Android 当安卓手机处于铃声模式时,手机会播放铃声,android,android-broadcast,Android,Android Broadcast,我有一个PhoneReceiver类,它扩展了我设置手机配置文件模式的BroadcastReceiver 沉默 AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); manager.setRingerMode(AudioManager.RINGER_MODE_SILENT); 当我显示带有的信息日志时 Log.i(“tag”,

我有一个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()
之后发生的。据我所知,手机已正确设置为静音模式,但当来电时,此功能完全被忽略

我在一个活动中也有相同的代码,当我从那里运行它时,它工作得很好(当接到电话时,电话是无声的)。这使我相信它与接收器中执行的静默模式代码有关

手机似乎陷入了忽略静音模式的状态。即使我卸载我的应用程序,手机仍会忽略静音模式。将手机设置为正常模式,然后从“我的活动”中返回静音模式,可以使手机再次正常工作。 我已经找了好几天这种行为的原因了,但我一直没有弄清楚

这是接受者类

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");
        }
    }
}
} 

接收器什么时候启动??因此,当有来电时,接收器被触发。发布你的接收器类。我已经发布了该类。