作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在响铃时更改铃声音量。下面的代码在响铃期间设置它(它在系统设置中更改)但它不会在实际响铃时生效(只有下一个响铃调用才会使用新值)。我可以强制此更改使它们立即生效吗?
AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audio.setStreamVolume(AudioManager.STREAM_RING, volume, AudioManager.FLAG_ALLOW_RINGER_MODES | AudioManager.FLAG_PLAY_SOUND);
最佳答案
经过一些研究和测试后,我发现只有在来电检测的早期阶段才有可能改变音量。重要的是不要在 onReceive()
方法中执行太多操作。
public class CallReceiver extends BroadcastReceiver {
private boolean isRinging = false;
private boolean isInProgress = false;
private Listener mListener = null;
// interface declaration
public interface Listener {
public void onPhoneStateChange(boolean state);
}
// registration of listener
public void registerListener (Listener listener) {
mListener = listener;
}
@Override
public void onReceive(Context context, Intent intent) {
String state = 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");
}
else if(TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
//do something when the call ends
if (context instanceof StateChecker)
((StateChecker) context).serviceStart();
Log.v("phone", "idle");
isRinging = false;
}
// sending notification to listener
if(mListener != null) {
mListener.onPhoneStateChange(isRinging);
Log.v("listener", "notified");
}
}
}
和来自服务的一些代码:
// listeners callbacks
public void onPhoneStateChange(boolean state) {
if (state) {
if (!callInProgress) {
// Do the main task here
callInProgress = true;
serviceDestroy();
}
} else {
callInProgress = false;
serviceStart();
}
}
服务启动:
// starting service
public void serviceStart() {
preferencesRead();
//The intent to launch when the user clicks the expanded notification
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);
if(settings.getBoolean("hide_noti_icon", false)) {
Notification noti = new NotificationCompat.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 {
Notification noti = new NotificationCompat.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 CallReceiver
if(isCRRegistered) {
unregisterReceiver(mCallReceiver);
isCRRegistered = false;
}
if(!isCRRegistered) {
IntentFilter filter2 = new IntentFilter("android.intent.action.PHONE_STATE");
filter2.addAction("android.intent.action.PHONE_STATE");
CallReceiver mCallReceiver = new CallReceiver();
this.mCallReceiver = mCallReceiver;
registerReceiver(mCallReceiver, filter2);
mCallReceiver.registerListener(this);
isCRRegistered = true;
}
if(isScreenRegistered) {
unregisterReceiver(mReceiver);
isScreenRegistered = false;
}
if(!isPositionRegistered && proximityOn) {
Position mPosition = new Position(this.getApplicationContext());
mPosition.registerListener(this);
mPosition.isInPocket();
this.mPosition = mPosition;
mPosition.register();
isPositionRegistered = true;
}
if(!isScreenRegistered) {
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
ScreenReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
this.mReceiver = mReceiver;
mReceiver.registerListener(this);
isScreenRegistered = true;
}
}
服务销毁()
// stopping service
public void serviceDestroy() {
if (this.mPosition != null) {
this.mPosition.unregister();
}
Log.v("service", "Destroyed");
if(isScreenRegistered) {
unregisterReceiver(mReceiver);
isScreenRegistered = false;
}
}
OnDestroy()
public void onDestroy () {
serviceDestroy();
if(isCRRegistered) {
unregisterReceiver(mCallReceiver);
isCRRegistered = false;
}
}
关于android - 在响铃期间更改铃声音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14429133/
目前我正在处理一项任务,我必须在应用程序中将 iPhone 静音/响铃。我找到了 a link !但是开发人员说 Apple 禁止在您的应用程序中使用此库,他们拒绝了您的应用程序。那么这些应用程序是如
编译准备好后,如何使 sbt 响铃(或播放声音,或执行某些系统命令、shell 命令)? 编译通常需要40秒或更长时间,所以我想在等待时小睡一下,100个编译已经是一个小时的 sleep 。 最佳答案
我是一名优秀的程序员,十分优秀!