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.