0
我知道Android有一个内置的系统,让用户选择一个电话簿联系人/组特殊的铃声,但我必须dinamically改变铃声同时呼吁:更改手机铃声同时响起
所以,我写了一个服务并在手机启动时加载它,以设置一个捕获来电的电话监听器,该电话监听器保存默认电话铃声(在Service变量中),并在必要时用另一个铃声更改原始铃声,然后恢复原信息铃声当电话状态返回空闲时。那么,我可以保存原来的音色,设置新的,但不能听到新的铃声,只有旧的:
看看我的代码,并记住,当电话听众选择如果改变原来的铃声,手机是已经响了。
那么,如何改变手机铃声,而手机已经响了?
我在我的清单中有android.permission.WRITE_SETTINGS
和android.permission.READ_PHONE_STATE
权限。
的服务:
public class CallFilterService extends Service {
private Uri originalRingtoneUri;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new CallFilterListener(this), PhoneStateListener.LISTEN_CALL_STATE);
return START_STICKY;
}
public void saveOriginalRingtone() {
originalRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE);
}
public void restoreOriginalRingtone() {
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, originalRingtoneUri);
}
}
的PhoneListener:
public class MyPhoneListener extends PhoneListener
{
private CallFilterService service;
private Uri specialRingtoneUri;
public CallFilterListener(CallFilterService service) {
super();
this.service = service;
specialRingtoneUri = setSpecialRingtone();
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
service.saveOriginalRingtone();
if (canChangeRingtone(incomingNumber)) {
//When in this if block, the default phone ringtone is already playing.
RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, specialRingtoneUri);
}
break;
}
case TelephonyManager.CALL_STATE_IDLE:
{
service.restoreOriginalRingtone();
break;
}
default:
break;
}
}
}
只是好奇。为什么要这么做?有什么好处? :) – user219882
我正在做一个大学项目,使用基于跨平台rdf便携式本体的安全系统。 –