首页 > 代码库 > android Music 中如何添加设置双卡铃声的菜单

android Music 中如何添加设置双卡铃声的菜单

1,打开情景模式的设置双卡铃声的feature:MTK_MULTISIM_ROINGTONE_SUPPORT,Music中却不能设置双卡铃声。
希望能在Music添加菜单“Us as SIM1/SIM2 ringtone”

1,string.xml,添加新的string ringtone_as_sim1_menu和ringtone_as_sim2_menu :

   <string name="ringtone_as_sim1_menu">Use as SIM1 ringtone</string>
    <string name="ringtone_as_sim2_menu">Use as SIM2 ringtone</string>
 
2,TrackBrowserActivity.java:
1),添加:
import com.mediatek.telephony.SimInfoManager;
import com.mediatek.common.featureoption.FeatureOption;


2),menu根据插卡情况添加Us as SIM1 ringtone/Us as SIM2 ringtone, 参考//start modify和//end modify之间的修改
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfoIn) {
 ....
 int isDrm = 0;
        if (MusicFeatureOption.IS_SUPPORT_DRM) {
            isDrm = mTrackCursor.getInt(mTrackCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.IS_DRM));
            int drmMethod = mTrackCursor.getInt(mTrackCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DRM_METHOD));
            if (canDispalyRingtone(isDrm, drmMethod)) {
            //start modify
    if(FeatureOption.MTK_GEMINI_SUPPORT &&FeatureOption.MTK_MULTISIM_RINGTONE_SUPPORT&&(SimInfoManager.getInsertedSimCount(this)==2)){
                    menu.add(0, USE_AS_SIM1_RINGTONE, 0, R.string.ringtone_as_sim1_menu);
     menu.add(0, USE_AS_SIM2_RINGTONE, 0, R.string.ringtone_as_sim2_menu);
    }else //end modify
            menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
            }
        } else {
        //start modify
               if(FeatureOption.MTK_GEMINI_SUPPORT &&(SIMInfoWrapper.getDefault().getInsertedSimCount()==2)){
                    menu.add(0, USE_AS_SIM1_RINGTONE, 0, R.string.ringtone_as_sim1_menu);
     menu.add(0, USE_AS_SIM2_RINGTONE, 0, R.string.ringtone_as_sim2_menu);
    }else //end modify
            menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
        }
....
}


3),添加USE_AS_SIM1_RINGTONE/USE_AS_SIM2_RINGTONE case的处理,参考//start modify和//end modify之间的修改
public boolean onContextItemSelected(MenuItem item) {
....
 switch (item.getItemId()) {
 ....
  case USE_AS_RINGTONE:
                // Set the system setting to make this the current ringtone
                MusicUtils.setRingtone(this, mSelectedId);
                return true;
   //start modify
   case USE_AS_SIM1_RINGTONE:
    // Set the system setting to make this the current ringtone
    MusicUtils.setRingtone(this, mSelectedId,0);
    return true;
   case USE_AS_SIM2_RINGTONE:
    // Set the system setting to make this the current ringtone
    MusicUtils.setRingtone(this, mSelectedId,1);
        return true;
        //end modify
....
}
3,MusicUtils.java:
1),
import com.mediatek.audioprofile.AudioProfileManager;
import com.mediatek.telephony.SimInfoManager;
import com.mediatek.common.featureoption.FeatureOption;
 
2),添加USE_AS_SIM1_RINGTONE/USE_AS_SIM2_RINGTONE的定义,并修改CHILD_MENU_BASE:
 public interface Defs {
         ....
        /// M: add for drm
        public final static int DRM_INFO = 15;
  public final static int USE_AS_SIM1_RINGTONE = 16;
  public final static int USE_AS_SIM2_RINGTONE = 17;
        //public final static int CHILD_MENU_BASE = 16; // this should be the last item
        public final static int CHILD_MENU_BASE = 18;


2)增加新的setRingtone()参数中增加slotId
a)请查询下packages\apps\settings\src\com\mediatek\audioprofile\DefaultRingtonePreference.java 的onClick()是否有“ setSimId(simList.get(0).mSimId);” 这句,这里表示使用单卡的时候,也加上SIM ID,如果有这句话请参考本条如下修改,如果没有下一条 b)的修改,:
static void setRingtone(Context context, long id, int slotID) {
ContentResolver resolver = context.getContentResolver();
     // Set the flag in the database to mark this as a ringtone
     Uri ringUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
     try {
      ContentValues values = new ContentValues(2);
      values.put(MediaStore.Audio.Media.IS_RINGTONE, "1");
      values.put(MediaStore.Audio.Media.IS_ALARM, "1");
      resolver.update(ringUri, values, null, null);
     } catch (UnsupportedOperationException ex) {
      // most likely the card just got unmounted
      MusicLogUtils.e(TAG, "couldn‘t set ringtone flag for id " + id);
      return;
     }
 
     String[] cols = new String[] {
       MediaStore.Audio.Media._ID,
       MediaStore.Audio.Media.DATA,
       MediaStore.Audio.Media.TITLE
     };
     /// M: use selectionArgs replace set query value in where @{
     String where = MediaStore.Audio.Media._ID + "=?";
     String[] whereArgs = new String[]{String.valueOf(id)};
     Cursor cursor = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
       cols, where , whereArgs, null);
     /// @}
     


 try {
            if (cursor != null && cursor.getCount() == 1) {
                // Set the system setting to make this the current ringtone
                cursor.moveToFirst();
               
            AudioProfileManager mProfileManager = (AudioProfileManager) context.getSystemService(Context.AUDIOPROFILE_SERVICE);
            String mActiveProfileKey = mProfileManager.getActiveProfileKey();
             
    
                List<SIMInfo> simList = SIMInfo.getInsertedSIMList(this.getContext());
                int simNum = simList.size();
               
                if (FeatureOption.MTK_MULTISIM_RINGTONE_SUPPORT&&(slotId==-1)&&(simNum==1 )) {
              
                    String uriKey=mActiveProfileKey + SUFFIX_RINGER_URI+SUFFIX_SIM_ID+simList.get(0).mSimId;
                    Settings.System.putString(resolver,uriKey, ringUri.toString());
                }
                else if(FeatureOption.MTK_MULTISIM_RINGTONE_SUPPORT&&(slotId!=-1)){
                long simId = SimInfoManager.getIdBySlot(context, slotId);          
                  mProfileManager.setRingtoneUri(mActiveProfileKey, AudioProfileManager.TYPE_RINGTONE, simId, ringUri);
             }
                else{
                Settings.System.putString(resolver, Settings.System.RINGTONE, ringUri.toString());
             }
           String message = context.getString(R.string.ringtone_set, cursor.getString(2));
           Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            }
        } finally {
....
}
}
b)packages\apps\settings\src\com\mediatek\audioprofile\DefaultRingtonePreference.java 的onClick()是否有“ setSimId(simList.get(0).mSimId);” 这句,如果没有这句话请参考本条如下修改:
static void setRingtone(Context context, long id, int slotID) {
ContentResolver resolver = context.getContentResolver();
     // Set the flag in the database to mark this as a ringtone
     Uri ringUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
     try {
      ContentValues values = new ContentValues(2);
      values.put(MediaStore.Audio.Media.IS_RINGTONE, "1");
      values.put(MediaStore.Audio.Media.IS_ALARM, "1");
      resolver.update(ringUri, values, null, null);
     } catch (UnsupportedOperationException ex) {
      // most likely the card just got unmounted
      MusicLogUtils.e(TAG, "couldn‘t set ringtone flag for id " + id);
      return;
     }
 
     String[] cols = new String[] {
       MediaStore.Audio.Media._ID,
       MediaStore.Audio.Media.DATA,
       MediaStore.Audio.Media.TITLE
     };
     /// M: use selectionArgs replace set query value in where @{
     String where = MediaStore.Audio.Media._ID + "=?";
     String[] whereArgs = new String[]{String.valueOf(id)};
     Cursor cursor = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
       cols, where , whereArgs, null);
     /// @}
     


 try {
            if (cursor != null && cursor.getCount() == 1) {
                // Set the system setting to make this the current ringtone
                cursor.moveToFirst();
               
            AudioProfileManager mProfileManager = (AudioProfileManager) context.getSystemService(Context.AUDIOPROFILE_SERVICE);
            String mActiveProfileKey = mProfileManager.getActiveProfileKey();
                       
           if(FeatureOption.MTK_MULTISIM_RINGTONE_SUPPORT&&(slotId!=-1)){
                long simId = SimInfoManager.getIdBySlot(context, slotId);          
                mProfileManager.setRingtoneUri(mActiveProfileKey, AudioProfileManager.TYPE_RINGTONE, simId, ringUri);
         }
           else{
                Settings.System.putString(resolver, Settings.System.RINGTONE, ringUri.toString());
              }
           String message = context.getString(R.string.ringtone_set, cursor.getString(2));
           Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            }
        } finally {
....
}
}


3)原来的setRingtone(Context context, long id)改成调用 setRingtone(Context context, long id, int slotID),但是slotId为-1:
static void setRingtone(Context context, long id) {
  setRingtone(context, id,-1);
  }
 
由于KK版本中删除了个别接口,目前的做法是恢复JB版本的接口。
对于KK版本中Music设置双卡铃声,请继续做如下修改:
1、在MusicUtils.java中开始处添加如下代码:
import java.util.List;
import android.provider.Telephony.SIMInfo;
 
2、确认在Music的Android.mk中添加telephony-common的library:
LOCAL_JAVA_LIBRARIES += mediatek-framework \
        telephony-common
 
3、在mediatek\frameworks\base\telephony\java\com\mediatek\telephony\SimInfoManager.java中添加如下方法:
    /**
     * Given a slot, return the Id of the SIM which is currently inserted in that slot
     * @param ctx
     * @param simSlotId the slot which the SIM is inserted
     * @return the index of the SIM card in database, 0 indicate that no SIM card is inserted
     */
    public static long getIdBySlot(Context ctx, int simSlotId) {
        logd("[getIdBySlot]+ simSlotId:" + simSlotId);
        SimInfoRecord simInfo = getSimInfoBySlot(ctx, simSlotId);
        if (simInfo != null) {
            logd("[getIdBySlot]- simInfoId:" + simInfo.mSimInfoId);
            return simInfo.mSimInfoId;
        }
        logd("[getIdBySlot]- null info, return 0");
        return 0;
    }

android Music 中如何添加设置双卡铃声的菜单