2012-05-26 41 views
0

我知道Android有一个内置的系统,让用户选择一个电话簿联系人/组特殊的铃声,但我必须dinamically改变铃声同时呼吁:更改手机铃声同时响起

所以,我写了一个服务并在手机启动时加载它,以设置一个捕获来电的电话监听器,该电话监听器保存默认电话铃声(在Service变量中),并在必要时用另一个铃声更改原始铃声,然后恢复原信息铃声当电话状态返回空闲时。那么,我可以保存原来的音色,设置新的,但不能听到新的铃声,只有旧的:

看看我的代码,并记住,当电话听众选择如果改变原来的铃声,手机是已经响了。

那么,如何改变手机铃声,而手机已经响了?

我在我的清单中有android.permission.WRITE_SETTINGSandroid.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; 
     } 
    } 
} 
+0

只是好奇。为什么要这么做?有什么好处? :) – user219882

+0

我正在做一个大学项目,使用基于跨平台rdf便携式本体的安全系统。 –

回答

0

首先,创建路径和文件名的文件:

File file = new File(path, songName); 

然后,准备查询:

ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.TITLE, "My Song title"); 
values.put(MediaStore.MediaColumns.SIZE, 215454); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
values.put(MediaStore.Audio.Media.ARTIST, "Artist"); 
values.put(MediaStore.Audio.Media.DURATION, 230); 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
values.put(MediaStore.Audio.Media.IS_ALARM, false); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

然后将其插入数据库:

Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); 
Uri newUri = this.getContentResolver().insert(uri, values); 

最后,设定铃声:

RingtoneManager.setActualDefaultRingtoneUri(
    myActivity, 
    RingtoneManager.TYPE_RINGTONE, 
    newUri 
); 

这里假设你有相应的权限。如果您的目标是API 23或更高版本,则除了在清单中声明它之外,还必须在运行时请求权限

相关问题