1 添加ro.config.ringtone_sim2值作为默认SIM2的铃声
方法一:
在 build/make/tools/buildinfo.sh
中添加
ro.config.ringtone_sim2=Cherry_ROCK.ogg
方法二:
在build/make/target/product/full_base.mk
中添加
# Additional settings used in all AOSP builds
PRODUCT_PROPERTY_OVERRIDES := \
ro.config.ringtone_sim2=Cherry_Tone_1.ogg \
ro.config.ringtone=Cherry_Caribbean.ogg \
ro.config.notification_sound=Cherry_Tone_1.ogg
这种添加需要额外加权限,否则在代码中通过SystemProperties获取不到值
在system/sepolicy/public/property_contexts
中添加如下代码
ro.config.ringtone u:object_r:exported2_config_prop:s0 exact string
2 在frameworks/base/media/java/android/media/MediaScanner.java中做如下修改
//weiyawei add double card bell start
private String mDefaultRingtoneSim2Filename;
private boolean mDefaultRingtoneSim2Set;
//weiyawei add double card bell end
private void setDefaultRingtoneFileNames() {
mDefaultRingtoneFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.RINGTONE);
//weiyawei add double card bell start
mDefaultRingtoneSim2Filename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX + Settings.System.RINGTONE_SIM2);
//weiyawei add double card bell end
mDefaultNotificationFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.NOTIFICATION_SOUND);
mDefaultAlarmAlertFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX
+ Settings.System.ALARM_ALERT);
}
public Uri doScanFile(String path, String mimeType, long lastModified,
long fileSize, boolean isDirectory, boolean scanAlways, boolean noMedia) {
.........
if (entry.mPath != null) {
if (((!mDefaultNotificationSet &&
doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename))
|| (!mDefaultRingtoneSet &&
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename))
//weiyawei add double card bell start
|| (!mDefaultRingtoneSim2Set &&
doesPathHaveFilename(entry.mPath, mDefaultRingtoneSim2Filename))
//weiyawei add double card bell start
|| (!mDefaultAlarmSet &&
doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)))) {
Log.w(TAG, "forcing rescan of " + entry.mPath +
"since ringtone setting didn't finish");
scanAlways = true;
} else if (isSystemSoundWithMetadata(entry.mPath)
&& !Build.FINGERPRINT.equals(sLastInternalScanFingerprint)) {
// file is located on the system partition where the date cannot be trusted:
// rescan if the build fingerprint has changed since the last scan.
Log.i(TAG, "forcing rescan of " + entry.mPath
+ " since build fingerprint changed");
scanAlways = true;
}
}
private Uri endFile(FileEntry entry, boolean ringtones, boolean notifications,
boolean alarms, boolean music, boolean podcasts)
throws RemoteException {
..........
if (notifications && ((mWasEmptyPriorToScan && !mDefaultNotificationSet) ||
mMediaScannerClientEx.doesSettingEmpty("notification_set", mContext))) {
if (TextUtils.isEmpty(mDefaultNotificationFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename)) {
needToSetSettings = true;
}
} else if (ringtones && ((mWasEmptyPriorToScan && !mDefaultRingtoneSet) ||
mMediaScannerClientEx.doesSettingEmpty("ringtone_set", mContext))) {
if (TextUtils.isEmpty(mDefaultRingtoneFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) {
needToSetSettings = true;
}
//weiyawei add double card bell start
} else if(ringtones && ((mWasEmptyPriorToScan && !mDefaultRingtoneSim2Set) ||
mMediaScannerClientEx.doesSettingEmpty("ringtone_sim2_set", mContext))) {
if (TextUtils.isEmpty(mDefaultRingtoneSim2Filename) ||
doesPathHaveFilename(entry.mPath, mDefaultRingtoneSim2Filename)) {
needToSetSettings = true;
}
}//weiyawei add double card bell end
else if (alarms && ((mWasEmptyPriorToScan && !mDefaultAlarmSet) ||
mMediaScannerClientEx.doesSettingEmpty("alarm_set", mContext))) {
if (TextUtils.isEmpty(mDefaultAlarmAlertFilename) ||
doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)) {
needToSetSettings = true;
}
}
..........
if(needToSetSettings) {
if (notifications &&
mMediaScannerClientEx.doesSettingEmpty("notification_set", mContext)) {
setRingtoneIfNotSet(Settings.System.NOTIFICATION_SOUND, tableUri, rowId);
mDefaultNotificationSet = true;
mMediaScannerClientEx.setSettingFlag("notification_set", mContext);
} else if (ringtones &&
mMediaScannerClientEx.doesSettingEmpty("ringtone_set", mContext)) {
setRingtoneIfNotSet(Settings.System.RINGTONE, tableUri, rowId);
mDefaultRingtoneSet = true;
mMediaScannerClientEx.setSettingFlag("ringtone_set", mContext);
//weiyawei add double card bell start
if(!TextUtils.isEmpty(mDefaultRingtoneSim2Filename)
&& !TextUtils.isEmpty(mDefaultRingtoneFilename)
&& mDefaultRingtoneSim2Filename.equals(mDefaultRingtoneFilename)
&& mMediaScannerClientEx.doesSettingEmpty("ringtone_sim2_set",mContext)){
setRingtoneIfNotSet(Settings.System.RINGTONE_SIM2,tableUri,rowId);
android.util.Log.i("weiyawei","intro set ringtone_sim2");
mDefaultRingtoneSim2Set = true;
mMediaScannerClientEx.setSettingFlag("ringtone_sim2_set",mContext);
}
}else if(ringtones &&
mMediaScannerClientEx.doesSettingEmpty("ringtone_sim2_set",mContext)){
setRingtoneIfNotSet(Settings.System.RINGTONE_SIM2,tableUri,rowId);
mDefaultRingtoneSim2Set = true;
mMediaScannerClientEx.setSettingFlag("ringtone_sim2_set",mContext);
//weiyawei add double card bell end
} else if (alarms &&
mMediaScannerClientEx.doesSettingEmpty("alarm_set", mContext)) {
setRingtoneIfNotSet(Settings.System.ALARM_ALERT, tableUri, rowId);
mDefaultAlarmSet = true;
mMediaScannerClientEx.setSettingFlag("alarm_set", mContext);
}
}
protected void prescan(String filePath, boolean prescanFiles) throws RemoteException {
.........
mDefaultRingtoneSet = wasRingtoneAlreadySet(Settings.System.RINGTONE);
//weiyawei add double card bell start
mDefaultRingtoneSim2Set = wasRingtoneAlreadySet(Settings.System.RINGTONE_SIM2);
//weiyawei add double card bell end
mDefaultNotificationSet = wasRingtoneAlreadySet(Settings.System.NOTIFICATION_SOUND);
mDefaultAlarmSet = wasRingtoneAlreadySet(Settings.System.ALARM_ALERT);
3 在frameworks/base/media/java/android/media/RingtoneManager.java中
//weiyawei add start
/*
*type for sim2 ringtone
*@hide
*@internal
*/
public static final int TYPE_RINGTONE_SIM2 = 8;
//weiyawei add end
private static String getSettingForType(int type) {
if ((type & TYPE_RINGTONE) != 0) {
return Settings.System.RINGTONE;
//weiyawei add double card bell start
}else if((type & TYPE_RINGTONE_SIM2) != 0){
return Settings.System.RINGTONE_SIM2;
//weiyawei add double card bell end
} else if ((type & TYPE_NOTIFICATION) != 0) {
return Settings.System.NOTIFICATION_SOUND;
} else if ((type & TYPE_ALARM) != 0) {
return Settings.System.ALARM_ALERT;
} else {
return null;
}
}
/** {@hide} */
public static Uri getCacheForType(int type, int userId) {
if ((type & TYPE_RINGTONE) != 0) {
return ContentProvider.maybeAddUserId(Settings.System.RINGTONE_CACHE_URI, userId);
//weiyawei add double card bell start
}else if((type & TYPE_RINGTONE_SIM2) != 0){
return ContentProvider.maybeAddUserId(Settings.System.RINGTONE_SIM2_CACHE_URI, userId);
//weiyawei add double card bell end
} else if ((type & TYPE_NOTIFICATION) != 0) {
return ContentProvider.maybeAddUserId(Settings.System.NOTIFICATION_SOUND_CACHE_URI,
userId);
} else if ((type & TYPE_ALARM) != 0) {
return ContentProvider.maybeAddUserId(Settings.System.ALARM_ALERT_CACHE_URI, userId);
}
return null;
}
public static int getDefaultType(Uri defaultRingtoneUri) {
defaultRingtoneUri = ContentProvider.getUriWithoutUserId(defaultRingtoneUri);
if (defaultRingtoneUri == null) {
return -1;
} else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI)) {
return TYPE_RINGTONE;
//weiyawei add double card bell start
}else if(defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_SIM2_URI)){
return TYPE_RINGTONE_SIM2;
//weiyawei add double card bell end
} 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;
}
}
public static Uri getDefaultUri(int type) {
if ((type & TYPE_RINGTONE) != 0) {
return Settings.System.DEFAULT_RINGTONE_URI;
//weiyawei add double card bell start
}else if((type & TYPE_RINGTONE_SIM2) != 0){
return Settings.System.DEFAULT_RINGTONE_SIM2_URI;
//weiyawei add double card bell end
} else if ((type & TYPE_NOTIFICATION) != 0) {
return Settings.System.DEFAULT_NOTIFICATION_URI;
} else if ((type & TYPE_ALARM) != 0) {
return Settings.System.DEFAULT_ALARM_ALERT_URI;
} else {
return null;
}
}
4 在 frameworks/base/core/java/android/provider/Settings.java
public static final Uri DEFAULT_RINGTONE_URI = getUriFor(RINGTONE);
/** {@hide} */
public static final String RINGTONE_CACHE = "ringtone_cache";
/** {@hide} */
public static final Uri RINGTONE_CACHE_URI = getUriFor(RINGTONE_CACHE);
//weiyawei add double card bell start
/** {@hide} */
public static final String RINGTONE_SIM2 = "ringtone_sim2";
/** {@hide} */
public static final Uri DEFAULT_RINGTONE_SIM2_URI = getUriFor(RINGTONE_SIM2);
/** {@hide} */
public static final String RINGTONE_SIM2_CACHE = "ringtone_sim2_cache";
/** {@hide} */
public static final Uri RINGTONE_SIM2_CACHE_URI = getUriFor(RINGTONE_SIM2_CACHE);
//weiyawei add double card bell end
5 由于更新了Settings,需要更新frameworks/base/api/current.txt文件
public class RingtoneManager {
field public static final int TYPE_RINGTONE_SIM2 = 8; // 0x8 新增
此值可在编译之后自行对比变动
6 framework中主要修改就是这些,再看下数据库更新,主要涉及文件
SettingsProtoDumpUtil.java
和SettingsProvider.java
SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
private static void dumpProtoSystemSettingsLocked(
@NonNull ProtoOutputStream p, long fieldId, @NonNull SettingsState s) {
......
//weiyawei add double card bell start
dumpSetting(s, p,
Settings.System.RINGTONE_SIM2,
SystemSettingsProto.Ringtone.DEFAULT_URI);
dumpSetting(s, p,
Settings.System.RINGTONE_SIM2_CACHE,
SystemSettingsProto.Ringtone.CACHE);
//weiyawei add double card bell end
SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
......
if (Settings.System.RINGTONE_CACHE_URI.equals(uri)) {
cacheRingtoneSetting = Settings.System.RINGTONE;
cacheName = Settings.System.RINGTONE_CACHE;
} else if (Settings.System.NOTIFICATION_SOUND_CACHE_URI.equals(uri)) {
cacheRingtoneSetting = Settings.System.NOTIFICATION_SOUND;
cacheName = Settings.System.NOTIFICATION_SOUND_CACHE;
//weiyawei add double card bell start
}else if(Settings.System.RINGTONE_SIM2_CACHE_URI.equals(uri)){
cacheRingtoneSetting = Settings.System.RINGTONE_SIM2;
cacheName = Settings.System.RINGTONE_SIM2_CACHE;
//weiyawei add double card bell end
} else if (Settings.System.ALARM_ALERT_CACHE_URI.equals(uri)) {
cacheRingtoneSetting = Settings.System.ALARM_ALERT;
cacheName = Settings.System.ALARM_ALERT_CACHE;
} else {
throw new FileNotFoundException("Direct file access no longer supported; "
+ "ringtone playback is available through android.media.Ringtone");
}
private boolean mutateSystemSetting(String name, String value, int runAsUserId,
int operation) {
......
if (Settings.System.RINGTONE.equals(name)) {
cacheName = Settings.System.RINGTONE_CACHE;
//weiyawei add double card bell start
}else if(Settings.System.RINGTONE_SIM2.equals(name)){
cacheName = Settings.System.RINGTONE_SIM2_CACHE;
//weiyawei add double card bell end
} else if (Settings.System.NOTIFICATION_SOUND.equals(name)) {
cacheName = Settings.System.NOTIFICATION_SOUND_CACHE;
} else if (Settings.System.ALARM_ALERT.equals(name)) {
cacheName = Settings.System.ALARM_ALERT_CACHE;
}
7 在packages/services/Telecomm/src/com/android/server/telecom/RingtoneFactory.java文件中修改
//weiyawei add double card bell start
import android.telephony.SubscriptionManager;
//weiyawei add double card bell end
public Ringtone getRingtone(Call incomingCall) {
// Use the default ringtone of the work profile if the contact is a work profile contact.
Context userContext = isWorkContact(incomingCall) ?
getWorkProfileContextForUser(mCallsManager.getCurrentUserHandle()) :
getContextForUserHandle(mCallsManager.getCurrentUserHandle());
Uri ringtoneUri = incomingCall.getRingtone();
Ringtone ringtone = null;
//weiyawei add double card bell start
int subId = incomingCall.getSubsciptionId();
int phoneId = SubscriptionManager.getPhoneId(subId);
//weiyawei add double card bell end
if(ringtoneUri != null && userContext != null) {
// Ringtone URI is explicitly specified. First, try to create a Ringtone with that.
android.util.Log.i("weiyawei","RingtoneFactory getRingtone 1111 phoneId == " + phoneId + " subId == " + subId);
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.
Context contextToUse = hasDefaultRingtoneForUser(userContext) ? userContext : mContext;
Uri defaultRingtoneUri;
if (UserManager.get(contextToUse).isUserUnlocked(contextToUse.getUserId())) {
//weiyawei add double card bell start
android.util.Log.i("weiyawei","RingtoneFactory getRingtone 2222 phoneId == " + phoneId + " subId == " + subId);
switch(phoneId){
case 0:
defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,
RingtoneManager.TYPE_RINGTONE);
break;
case 1:
defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,
RingtoneManager.TYPE_RINGTONE_SIM2);
break;
default:
defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,
RingtoneManager.TYPE_RINGTONE);
break;
}
//weiyawei add double card bell end
} else {
剩下的就是设置里面添加界面之类的东西了https://download.csdn.net/download/yangfan1571397878/11457824