我的应用程序允许您为不同的传入事件指定不同的铃声.EG:来电,来电短信等
我想要完成的是当我收到例如来电时,如果选择了特定选项,我检查我的应用数据库,如果有铃声选项设置播放该铃声.
但是我遇到的问题是我无法覆盖/停止播放默认的手机铃声.
我尝试了几种不同的方法,但从文档中,大多数方法只停止当前实例,而不是全局方法.
我无法在默认电话铃声设置中设置铃声,因为它需要基于来电动态.
如果有人知道一个技巧或一种方法来完成这将是伟大的.我希望这是有道理的.
ask*_*msk 12
动态更改铃声有几个步骤.
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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
// 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);
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
Run Code Online (Sandbox Code Playgroud)
主要想法是挂接来电并用自己的铃声替换铃声.当然,您应该在通话后将默认铃声恢复为已保存的值.
从 API 5 (Android 2.x) 开始,联系人数据库有一个 CUSTOM_RINGTONE 字段,请参阅此页面:
该字段的值必须是content://
媒体文件的 URI。您可以从内容提供商处获取一份MedciaStore
:
http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html
这可能足以让您开始。这都是标准内容提供商的东西;这两项任务都有大量现有材料。
归档时间: |
|
查看次数: |
4501 次 |
最近记录: |