Android P版本添加雙卡鈴聲

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.javaSettingsProvider.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章