Android 来电动态覆盖默认铃声
我的应用程序允许您为不同的传入事件指定不同的铃声。例如:来电、短信等 我试图做到的是,当我接到一个来电时,我检查我的应用程序数据库,看是否选择了一个特定的选项,是否有铃声选项设置播放该铃声 但是,我遇到的问题是无法覆盖/停止播放默认手机铃声 我尝试了几种不同的方法,但从文档中可以看出,大多数方法只停止当前实例,而不是全局方法 我无法在默认电话铃声设置中设置铃声,因为它需要根据来电动态设置 如果有人知道实现这一点的诀窍或方法,那就太好了。 我希望这是有意义的。从API 5(Android 2.x)开始,联系人数据库有一个自定义铃声字段,请参见本页: 此字段的值必须是媒体文件的Android 来电动态覆盖默认铃声,android,ringtone,Android,Ringtone,我的应用程序允许您为不同的传入事件指定不同的铃声。例如:来电、短信等 我试图做到的是,当我接到一个来电时,我检查我的应用程序数据库,看是否选择了一个特定的选项,是否有铃声选项设置播放该铃声 但是,我遇到的问题是无法覆盖/停止播放默认手机铃声 我尝试了几种不同的方法,但从文档中可以看出,大多数方法只停止当前实例,而不是全局方法 我无法在默认电话铃声设置中设置铃声,因为它需要根据来电动态设置 如果有人知道实现这一点的诀窍或方法,那就太好了。 我希望这是有意义的。从API 5(Android 2.x)
content://
URI。您可以从MedciaStore
内容提供商处获得:
这可能足以让你开始。这是所有标准的内容提供商的东西;这两项任务都有大量现有资料。动态更改铃声有几个步骤 1.准备铃声 2.将其插入数据库 3.保存当前默认铃声并订阅CallListener 4.创建MyCallListener类 5.向您的AndroidManifest.xml添加权限
6.多恩
主要的想法是挂接来电,并用自己的铃声代替铃声。当然,您应该在通话后将默认铃声恢复为已保存的值。不知怎的,对我来说,即使手机铃声已被有效替换,但仍会播放旧铃声。。。有什么线索吗?没有足够的信息来解释。试着看看日志。设置getActualDefaultRingtoneUri后,尝试检查其返回值。我检查了(getActualDefaultRingtoneUri),该值是正确的,如果我在CALL\u STATE\u IDLE时不将其还原,它将是默认值。似乎系统在我更改铃声Uri之前获取了要播放的铃声Uri。我仍然被要求包含
写入外部存储
权限
File k = new File("/sdcard/ringtone", "kolyan_.mp3");
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "My Song title");
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg");
values.put(MediaStore.Audio.Media.ARTIST, "Some Artist");
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(k.getAbsolutePath());
// Line below is major because we need to delete old entry
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
mUri = getContentResolver().insert(uri, values);
// Be careful by calling getActualDefaultRingtoneUri in CallListener, it could return null, better way to save it in OnCreate
mOldUri = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);
TelephonyManager mTelephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyMgr.listen(new MyCallListener(), PhoneStateListener.LISTEN_CALL_STATE);
class MyCallListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
// On call you replace the ringtone with your own mUri
RingtoneManager.setActualDefaultRingtoneUri(
MainActivity.this,
RingtoneManager.TYPE_RINGTONE,
mUri
);
break;
case TelephonyManager.CALL_STATE_IDLE:
// Restore the default ringtone
RingtoneManager.setActualDefaultRingtoneUri(
MainActivity.this,
RingtoneManager.TYPE_RINGTONE,
mOldUri
);
break;
default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>