简体   繁体   中英

Turn off sound for incoming calls works randomly

After search a long time, i can't solve my issue.

In my app, i want to control incoming call phones numbers silently with a whitelist.

This is the code used, sometimes it's work perfectly but not everytime. The ringer mode was restored, i can control it when i push upper or lower volume control, but no sound will be output to the device.

Is it possible to change the ringer mode when the phone is ringing ? My test is on S3 4.3

Thanks for your time to help me.

public class CallReceiver extends BroadcastReceiver {

private static final String TAG = CallReceiver.class.getSimpleName();
private static final String EMERGENCY="112";
private ITelephony telephonyService;
private AudioManager maudio;

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

        if (intent.getAction().equals("android.intent.action.PHONE_STATE")) { 

              AudioManager maudio=(AudioManager)context.getSystemService(context.AUDIO_SERVICE);
            //backup audio setting before mute
              Integer ringcheck=maudio.getRingerMode();

            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

            if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
                // Incoming call

                //set mute before control allowed/denied
                maudio.setRingerMode(0);

                String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                if( !Control.AuthorizeSender(context,"in","CALL",incomingNumber,"Phone call."))
                {

                     TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
                      try {
                       Class c = Class.forName(telephony.getClass().getName());
                       Method m = c.getDeclaredMethod("getITelephony");
                       m.setAccessible(true);
                       telephonyService = (ITelephony) m.invoke(telephony);
                       telephonyService.endCall();
                      } catch (Exception e) {
                       e.printStackTrace();
                      }
                }
                else
                {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                //restore audio
                if (ringcheck == 1)
                    maudio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                else if (ringcheck == 2)
                    maudio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);

            } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
                Log.d(TAG,"Offhook");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

Permissions

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE" />

Permission:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Code:

// Disable ringtone & vibration
AudioManager am = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE);
int ringerMode = am.getRingerMode();
am.setRingerMode(AudioManager.RINGER_MODE_SILENT);

... doing something ...

// Restore ringtone settings after check
am.setRingerMode(ringerMode);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM