Changing Ringer Volume During Ringing
I'd like to change the ringer volume during ringing. Code below sets it during ringing (it is changed in system settings) but it doesn't come to effect with actual ringing (only th
Solution 1:
After some research and tests I've found that volume change is possible only in very early stage of incomming call detection. It's vital not to do much operations inside the onReceive()
method.
publicclassCallReceiverextendsBroadcastReceiver {
privatebooleanisRinging=false;
privatebooleanisInProgress=false;
privateListenermListener=null;
// interface declarationpublicinterfaceListener {
publicvoidonPhoneStateChange(boolean state);
}
// registration of listenerpublicvoidregisterListener(Listener listener) {
mListener = listener;
}
@OverridepublicvoidonReceive(Context context, Intent intent) {
Stringstate= intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if(TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
// do something while ringing BUT NOT TOO MUCH!
isRinging = true;
if (context instanceof StateChecker)
((StateChecker) context).serviceDestroy();
Log.v("phone", "ringing");
}
elseif(TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
//do something when the call endsif (context instanceof StateChecker)
((StateChecker) context).serviceStart();
Log.v("phone", "idle");
isRinging = false;
}
// sending notification to listenerif(mListener != null) {
mListener.onPhoneStateChange(isRinging);
Log.v("listener", "notified");
}
}
}
and some code from service:
// listeners callbackspublicvoidonPhoneStateChange(boolean state) {
if (state) {
if (!callInProgress) {
// Do the main task here
callInProgress = true;
serviceDestroy();
}
} else {
callInProgress = false;
serviceStart();
}
}
ServiceStart:
// starting servicepublicvoidserviceStart() {
preferencesRead();
//The intent to launch when the user clicks the expanded notificationIntentintent=newIntent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntentpendIntent= PendingIntent.getActivity(this, 0, intent, 0);
if(settings.getBoolean("hide_noti_icon", false)) {
Notificationnoti=newNotificationCompat.Builder(this)
.setContentTitle("Intelligent Ringer")
.setContentText(getString(R.string.is_running))
.setSmallIcon(R.drawable.invisible)
.setContentIntent(pendIntent)
.setPriority(Notification.PRIORITY_MIN)
.build();
startForeground(12345, noti);
} else {
Notificationnoti=newNotificationCompat.Builder(this)
.setContentTitle("Intelligent Ringer")
.setContentText(getString(R.string.is_running))
.setSmallIcon(R.drawable.ic_launcher)
.setContentIntent(pendIntent)
.setPriority(Notification.PRIORITY_MIN)
.build();
startForeground(12345, noti);
}
Log.v("service", "started");
// registering listener for CallReceiverif(isCRRegistered) {
unregisterReceiver(mCallReceiver);
isCRRegistered = false;
}
if(!isCRRegistered) {
IntentFilterfilter2=newIntentFilter("android.intent.action.PHONE_STATE");
filter2.addAction("android.intent.action.PHONE_STATE");
CallReceivermCallReceiver=newCallReceiver();
this.mCallReceiver = mCallReceiver;
registerReceiver(mCallReceiver, filter2);
mCallReceiver.registerListener(this);
isCRRegistered = true;
}
if(isScreenRegistered) {
unregisterReceiver(mReceiver);
isScreenRegistered = false;
}
if(!isPositionRegistered && proximityOn) {
PositionmPosition=newPosition(this.getApplicationContext());
mPosition.registerListener(this);
mPosition.isInPocket();
this.mPosition = mPosition;
mPosition.register();
isPositionRegistered = true;
}
if(!isScreenRegistered) {
IntentFilterfilter=newIntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
ScreenReceivermReceiver=newScreenReceiver();
registerReceiver(mReceiver, filter);
this.mReceiver = mReceiver;
mReceiver.registerListener(this);
isScreenRegistered = true;
}
}
Servicedestroy()
// stopping servicepublicvoidserviceDestroy() {
if (this.mPosition != null) {
this.mPosition.unregister();
}
Log.v("service", "Destroyed");
if(isScreenRegistered) {
unregisterReceiver(mReceiver);
isScreenRegistered = false;
}
}
OnDestroy()
publicvoidonDestroy () {
serviceDestroy();
if(isCRRegistered) {
unregisterReceiver(mCallReceiver);
isCRRegistered = false;
}
}
Post a Comment for "Changing Ringer Volume During Ringing"