1. 双卡铃声功能
17年做的第一个功能,原因是因为mtk在7.0移除了audioprofile,所以没有了双卡铃声,主要思路是在原来单卡的基础上再添加一个存储铃声的标记。来电根据sim卡id之类的来判断卡一卡二,播放对应的铃声。
主要代码
alps\build\target\product\full_base.mk
PRODUCT_PROPERTY_OVERRIDES:= \
ro.config.ringtone=Ring_Synth_04.ogg \
ro.config.notification_sound=pixiedust.ogg\
ro.config.ringtone_sim2=Ring_Synth_04.ogg
alps\frameworks\base\core\java\android\provider\Settings.java
public staticfinal Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE);
//add by illa start
publicstatic final String RINGTONE_SIM2 = "ringtone_sim2";
public static final UriDEFAULT_RINGTONE_SIM2_URI = getUriFor(RINGTONE_SIM2);
publicstatic final String RINGTONE_CACHESIM = "ringtonesim_cache";
public static final Uri RINGTONE_CACHESIM_URI= getUriFor(RINGTONE_CACHESIM);
//add by illa end
/**{@hide} */
public static final String RINGTONE_CACHE ="ringtone_cache";
alps\frameworks\base\media\java\android\media\MediaScanner.java
private static final StringDEFAULT_RINGTONE_PROPERTY_PREFIX = "ro.config.";
//add by illa start
private StringmDefaultRingtoneSim2Filename;
private booleanmDefaultRingtoneSim2Set;
private static finalString RINGTONE_SIM2_SET = "ringtone_sim2_set";
//add by illa end
private final BitmapFactory.OptionsmBitmapOptions = new BitmapFactory.Options();
private void setDefaultRingtoneFileNames() {
…
mDefaultAlarmAlertFilename =SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.ALARM_ALERT);
//add by illa start
mDefaultRingtoneSim2Filename =SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+Settings.System.RINGTONE_SIM2);
//add by illa end
…
}
public UridoScanFile(String path, String mimeType, long lastModified,
long fileSize, booleanisDirectory, boolean scanAlways, boolean noMedia) {
…
doesPathHaveFilename(entry.mPath,mDefaultRingtoneFilename))
//add by illa start
||(!mDefaultRingtoneSim2Set &&
doesPathHaveFilename(entry.mPath,"mDefaultRingtoneSim2Filename")
//add by illa end
|| (!mDefaultAlarmSet &&
doesPathHaveFilename(entry.mPath,mDefaultAlarmAlertFilename)))) {
…
}
private Uri endFile(FileEntry entry,boolean ringtones, boolean notifications,
boolean alarms, boolean music,boolean podcasts){
// update database
boolean isSim2Ringtone = false; //add byilla
//add by illa start
} else if (ringtones &&((mWasEmptyPriorToScan &&(!mDefaultRingtoneSet||!mDefaultRingtoneSim2Set)) ||
doesSettingEmpty(RINGTONE_SET)||doesSettingEmpty(RINGTONE_SIM2_SET))) {
if(TextUtils.isEmpty(mDefaultRingtoneFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) {
needToSetSettings = true;
/// M: Adds log to debugsetting ringtones.
if (DEBUG) {
Log.v(TAG,"endFile111: needToSetRingtone=true.");
}
} elseif(TextUtils.isEmpty(mDefaultRingtoneSim2Filename) ||
doesPathHaveFilename(entry.mPath,"mDefaultRingtoneSim2Filename")) {
needToSetSettings = true;
isSim2Ringtone = true;
Log.v(TAG,"endFile22222: needToSetRingtone=true.sim2 default ringtone");
}
//addby illa end
} else if (alarms &&((mWasEmptyPriorToScan && !mDefaultAlarmSet) ||
…
}
…..
} else if (ringtones &&(doesSettingEmpty(RINGTONE_SET)||doesSettingEmpty(RINGTONE_SIM2_SET))) {
if (!isSim2Ringtone) {
setSettingIfNotSet(Settings.System.RINGTONE, tableUri, rowId);
if(mDefaultRingtoneSim2Filename.equals(mDefaultRingtoneFilename)){
setSettingIfNotSet(Settings.System.RINGTONE_SIM2,tableUri, rowId);
}
mDefaultRingtoneSet = true;
setSettingFlag(RINGTONE_SET);
Log.v(TAG, "endFile:set 1111ringtone. uri=" + tableUri + ", rowId=" + rowId);
} else {
setSettingIfNotSet(Settings.System.RINGTONE_SIM2, tableUri, rowId);
//setProfileSettings(RingtoneManager.TYPE_RINGTONE_SIM2,tableUri, rowId);
mDefaultRingtoneSim2Set =true;
setSettingFlag(RINGTONE_SIM2_SET);
Log.v(TAG, "endFile:set22222 sim2 ringtone. uri=" + tableUri + ", rowId=" + rowId);
}
//add by illa end
}else if (alarms && doesSettingEmpty(ALARM_SET)) {
…..
private void prescan(String filePath,boolean prescanFiles) throws RemoteException {
…..
mDefaultAlarmSet =wasRingtoneAlreadySet(Settings.System.ALARM_ALERT);
mDefaultRingtoneSim2Set= wasRingtoneAlreadySet(Settings.System.RINGTONE_SIM2);//add byilla
….
alps\frameworks\base\media\java\android\media\RingtoneManager.java
public static final int TYPE_RINGTONE = 1;
//addby illa start
publicstatic final int TYPE_RINGTONE_SIM2 = 32;
publicstatic final String KEY_DEFAULT_RINGTONE_SIM2 ="mtk_audioprofile_default_ringtone_sim2";
//add by illa end
….
private static String getSettingForType(inttype) {
if ((type & TYPE_RINGTONE) != 0) {
return Settings.System.RINGTONE;
} else if ((type &TYPE_RINGTONE_SIM2) != 0) {//add by illa
returnSettings.System.RINGTONE_SIM2;
} else if ((type & TYPE_NOTIFICATION)!= 0) {
returnSettings.System.NOTIFICATION_SOUND;
} else if ((type & TYPE_ALARM) !=0) {
return Settings.System.ALARM_ALERT;
} else {
return null;
}
}
/** {@hide} */
public static Uri getCacheForType(int type){
if ((type & TYPE_RINGTONE) != 0) {
returnSettings.System.RINGTONE_CACHE_URI;
} else if ((type &TYPE_RINGTONE_SIM2) != 0) {//add by illa
returnSettings.System.RINGTONE_CACHESIM_URI;
}else if ((type &TYPE_NOTIFICATION) != 0) {
returnSettings.System.NOTIFICATION_SOUND_CACHE_URI;
} else if ((type & TYPE_ALARM) !=0) {
returnSettings.System.ALARM_ALERT_CACHE_URI;
} else {
return null;
}
}
…
public static int getDefaultType(UridefaultRingtoneUri) {
if (defaultRingtoneUri == null) {
return -1;
} else if(defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI)) {
return TYPE_RINGTONE;
} else if(defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_SIM2_URI)) {//addbyilla
return TYPE_RINGTONE_SIM2;
} else if(defaultRingtoneUri.equals(Settings.System.DEFAULT_NOTIFICATION_URI)) {
return TYPE_NOTIFICATION;
} else if(defaultRingtoneUri.equals(Settings.System.DEFAULT_ALARM_ALERT_URI)) {
return TYPE_ALARM;
} else {
return -1;
}
}
/**
* Returns the {@link Uri} for the defaultringtone of a particular type.
* Rather than returning the actualringtone's sound {@link Uri}, this will
* return the symbolic {@link Uri} whichwill resolved to the actual sound
* when played.
*
* @param type The ringtone type whosedefault should be returned.
* @return The {@link Uri} of the defaultringtone for the given type.
*/
public static Uri getDefaultUri(int type) {
if ((type & TYPE_RINGTONE) != 0) {
return Settings.System.DEFAULT_RINGTONE_URI;
} if ((type & TYPE_RINGTONE_SIM2)!= 0) {//add by illa
returnSettings.System.DEFAULT_RINGTONE_SIM2_URI;
}else if ((type &TYPE_NOTIFICATION) != 0) {
returnSettings.System.DEFAULT_NOTIFICATION_URI;
} else if ((type & TYPE_ALARM) !=0) {
returnSettings.System.DEFAULT_ALARM_ALERT_URI;
} else {
return null;
}
}
alps\packages\services\Telecomm\src\com\android\server\telecom\RingtoneFactory.java
public Ringtone getRingtone(Call incomingCall) {
// Use the default ringtone of the work profile if the contact is a workprofile contact.
Context userContext = isWorkContact(incomingCall) ?
getWorkProfileContextForUser(mCallsManager.getCurrentUserHandle()):
getContextForUserHandle(mCallsManager.getCurrentUserHandle());
Uri ringtoneUri = incomingCall.getRingtone();
Ringtone ringtone = null;
if(ringtoneUri != null && userContext != null) {
// Ringtone URI is explicitly specified. First, try to create a Ringtonewith that.
ringtone = RingtoneManager.getRingtone(userContext, ringtoneUri);
}
if(ringtone == null) {
// Contact didn't specify ringtone or custom Ringtone creation failed.Get default
// ringtone for user or profile.
if(incomingCall.getSubId()== SubscriptionManager.getSubId(1)[0]){
ringtone = RingtoneManager.getRingtone(
hasDefaultRingtoneForUser(userContext)? userContext : mContext,
Settings.System.DEFAULT_RINGTONE_SIM2_URI);
}else{
ringtone= RingtoneManager.getRingtone(
hasDefaultRingtoneForUser(userContext) ? userContext : mContext,
Settings.System.DEFAULT_RINGTONE_URI);
}
}
if (ringtone != null) {
ringtone.setStreamType(AudioManager.STREAM_RING);
}
return ringtone;
}
设置sim2的时候
Settings.System.putString(resolver, Settings.System.RINGTONE_SIM2, ringUri.toString());
保存在这里就可以
packages\apps\PhoneCommon\src\com\android\phone\common\util\SettingsUtil.java
public staticvoid updateRingtoneName(
Context context, Handler handler,int type, String key, int msg) {
final Uri ringtoneUri;
boolean defaultRingtone = false;
if (type ==RingtoneManager.TYPE_RINGTONE || type ==RingtoneManager.TYPE_RINGTONE_SIM2/*add byilla */) {
// For ringtones, we can justlookup the system default because changing the settings
// in Call Settings changes thesystem default.
ringtoneUri =RingtoneManager.getActualDefaultRingtoneUri(context, type);
}
这没什么难度