根据我们之前的流程梳理,我们了解了铃声的播放,铃声的设置。今天我们就来详细讲解双卡铃声的实现。

一、配置双卡铃声

我们首先需要在配置文件中添加SIM卡二的配置

路径:platform/build/target/product/full_base.mk

# Additional settings used in all AOSP builds
PRODUCT_PROPERTY_OVERRIDES := \ro.config.ringtone=Ring_Synth_04.ogg \ro.config.ringtone_2=Ring_Synth_04.ogg \ro.config.notification_sound=pixiedust.ogg

二、FrameWork配置

我们需要添加一些标志位和路径信息

路径:/frameworks/base/core/java/android/provider/Settings.java

       //add by xiangzaixiansheng for support dual sim card ringtones/*** Persistent store for the SIM-2 rigntone url* Persistent store for the SIM-2 ringtone URI.* <p>* If you need to play SIM-2 ringtone at any given time, it is recommended* you give {@link #DEFAULT_RINGTONE_URI_2} to the media player.  It will resolve* to the set default ringtone at the time of playing.** @see #DEFAULT_RINGTONE_URI_2* @hide*/public static final String RINGTONE_2 = "ringtone_2";private static final Validator RINGTONE_2_VALIDATOR = sUriValidator;。。。。。//add by xiangzaixiansheng for support dual sim card ringtones  @{/*** Definite to the current sim-2 rigntone* A {@link Uri} that will point to the current SIM-2 ringtone at any* given time.* <p>* If the current default ringtone is in the DRM provider and the caller* does not have permission, the exception will be a* FileNotFoundException.** @hide*/public static final Uri DEFAULT_RINGTONE_URI_2 = getUriFor(RINGTONE_2);。。。。。//add by xiangzaixiansheng for support dual sim card ringtones  @{/** {@hide} */public static final String RINGTONE_CACHE_2 = "ringtone_cache_2";/** {@hide} */public static final Uri RINGTONE_CACHE_URI_2 = getUriFor(RINGTONE_CACHE_2);//add by xiangzaixiansheng  for support dual sim card ringtones  @}。。。。。public static final String[] SETTINGS_TO_BACKUP = {。。。。LOCKSCREEN_SOUNDS_ENABLED,SHOW_WEB_SUGGESTIONS,SIP_CALL_OPTIONS,SIP_RECEIVE_CALLS,POINTER_SPEED,VIBRATE_WHEN_RINGING,RINGTONE,//add by xiangzaixiansheng for support dual sim card ringtones  @{RINGTONE_2,//MMS_NOTIFICATION_SOUND,//add by xiangzaixiansheng for support dual sim card ringtones  @}LOCK_TO_APP_ENABLED,
。。。。。。};。。。。。。public static final Set<String> PUBLIC_SETTINGS = new ArraySet<>();static {。。。。。。PUBLIC_SETTINGS.add(SHOW_WEB_SUGGESTIONS);PUBLIC_SETTINGS.add(VIBRATE_WHEN_RINGING);/// M: Add MTK settings to PUBLIC group @{putMtkSettingsToSet(className, "putInPublicSettings", Set.class, PUBLIC_SETTINGS);/// @}//add by xiangzaixiansheng for support dual sim card ringtones  @{PUBLIC_SETTINGS.add(RINGTONE_2);//add by xiangzaixiansheng for support dual sim card ringtones  @}}。。。。。public static final Map<String, Validator> VALIDATORS = new ArrayMap<>();static {VALIDATORS.put(END_BUTTON_BEHAVIOR,END_BUTTON_BEHAVIOR_VALIDATOR);。。。。。。。。。VALIDATORS.put(WIFI_STATIC_DNS2, WIFI_STATIC_DNS2_VALIDATOR);VALIDATORS.put(SHOW_BATTERY_PERCENT, SHOW_BATTERY_PERCENT_VALIDATOR);//add by xiangzaixiansheng for support dual sim card ringtones @{VALIDATORS.put(RINGTONE_2, RINGTONE_2_VALIDATOR);//VALIDATORS.put(MMS_NOTIFICATION_SOUND, MMS_NOTIFICATION_SOUND_VALIDATOR);//add by xiangzaixiansheng for support dual sim card ringtones  @}}

路径:/frameworks/base/media/java/android/media/MediaScanner.java

    //导包import android.telephony.TelephonyManager;//add by xiangzaixiansheng for support dual sim card ringtones @{/** Whether the scanner has set a default sound for the ringer ringtone 2. */private boolean mDefaultRingtone2Set;//add by xiangzaixiansheng for support dual sim card ringtones @}//add by xiangzaixiansheng for support dual sim card ringtones  @{/** The filename for the default sound for the ringer ringtone 2. */private String mDefaultRingtone2Filename;//add by xiangzaixiansheng for support dual sim card ringtones  @}private void setDefaultRingtoneFileNames() {mDefaultRingtoneFilename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX+ Settings.System.RINGTONE);//add by xiangzaixiansheng for support dual sim card ringtones @{mDefaultRingtone2Filename = SystemProperties.get(DEFAULT_RINGTONE_PROPERTY_PREFIX+ Settings.System.RINGTONE_2);//add by xiangzaixiansheng for support dual sim card ringtones  @}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) {Uri result = null;
//            long t1 = System.currentTimeMillis();try {FileEntry entry = beginFile(path, mimeType, lastModified,fileSize, isDirectory, noMedia);if (entry == null) {return null;}// if this file was just inserted via mtp, set the rowid to zero// (even though it already exists in the database), to trigger// the correct code path for updating its entryif (mMtpObjectHandle != 0) {entry.mRowId = 0;}if (entry.mPath != null) {if (((!mDefaultNotificationSet &&doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename))|| (!mDefaultRingtoneSet &&doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename))//add by xiangzaixiansheng for support dual sim card ringtones  @{|| (!mDefaultRingtone2Set&&doesPathHaveFilename(entry.mPath, mDefaultRingtone2Filename))//|| (!mDefaultMmsNotificationSet&&//       doesPathHaveFilename(entry.mPath, mDefaultMmsNotificationFilename))//add by xiangzaixiansheng for support dual sim card ringtones ZAL1680G-844 @}|| (!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)
}............private Uri endFile(FileEntry entry, boolean ringtones, boolean notifications,boolean alarms, boolean music, boolean podcasts)throws RemoteException {boolean needToSetSettings = false;//add by xiangzaixiansheng for support dual sim card ringtones  @{boolean needToSetRingtoneSettings = false;boolean needToSetRingtone2Settings = false;//boolean needToSetMmsNotification = false;boolean needToSetDefaultNotification = false;//add by xiangzaixiansheng for support dual sim card ringtones  @}// Setting a flag in order not to use bulk insert for the file related with// notifications, ringtones, and alarms, because the rowId of the inserted file is// needed.//add by xiangzaixiansheng for support dual sim card ringtones  @{if (notifications && !mDefaultNotificationSet) {if (!mDefaultNotificationSet && (TextUtils.isEmpty(mDefaultNotificationFilename) ||doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename))) {needToSetSettings = true;needToSetDefaultNotification = true;}//  if ((TextUtils.isEmpty(mDefaultMmsNotificationFilename) ||//      doesPathHaveFilename(entry.mPath, mDefaultMmsNotificationFilename))) {//     needToSetSettings = true;//      needToSetMmsNotification = true;//  }} else if (ringtones && (!mDefaultRingtoneSet || !mDefaultRingtone2Set)) {if (!mDefaultRingtoneSet && (TextUtils.isEmpty(mDefaultRingtoneFilename) ||doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename))) {needToSetSettings = true;needToSetRingtoneSettings = true;}if (!mDefaultRingtone2Set && (TextUtils.isEmpty(mDefaultRingtone2Filename) ||doesPathHaveFilename(entry.mPath, mDefaultRingtone2Filename))) {needToSetSettings = true;needToSetRingtone2Settings = true;//add by xiangzaixiansheng for support dual sim card ringtones @}}} else if (alarms && !mDefaultAlarmSet) {if (TextUtils.isEmpty(mDefaultAlarmAlertFilename) ||doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)) {needToSetSettings = true;}}
..............
if(needToSetSettings) {if (notifications) {//add by xiangzaixiansheng for support dual sim card ringtones  @{if(needToSetDefaultNotification){setRingtoneIfNotSet(Settings.System.NOTIFICATION_SOUND, tableUri, rowId);mDefaultNotificationSet = true;}// if(needToSetMmsNotification){//     setRingtoneIfNotSet(Settings.System.MMS_NOTIFICATION_SOUND, tableUri, rowId);//      mDefaultMmsNotificationSet = true;//  }} else if (ringtones) {// memorize default system ringtone persistently//setRingtoneIfNotSet(Settings.System.DEFAULT_RINGTONE, tableUri, rowId);if (needToSetRingtoneSettings) {setRingtoneIfNotSet(Settings.System.RINGTONE, tableUri, rowId);mDefaultRingtoneSet = true;}if (TelephonyManager.getDefault().isMultiSimEnabled()) {if (needToSetRingtone2Settings){setRingtoneIfNotSet(Settings.System.RINGTONE_2, tableUri, rowId);mDefaultRingtone2Set = true;}}//add by xiangzaixiansheng for support dual sim card ringtones  @}........................
}........................private void prescan(String filePath, boolean prescanFiles) throws RemoteException {
........mDefaultRingtone2Set= wasRingtoneAlreadySet(Settings.System.RINGTONE_2);
........}

路径:/frameworks/base/media/java/android/media/RingtoneManager.java

    //add by xiangzaixiansheng for support dual sim card ringtones  @{/*** Type that refers to sounds that are used for mms notifications.* Note: This constant value is only for internal usage and* can't be added to TYPE_ALL.** @hide*/// public static final int TYPE_MMS_NOTIFICATION = 16;public static final int TYPE_RINGTONE_2 = 32;//add by xiangzaixiansheng for support dual sim card ringtones @}private void setFilterColumnsList(int type) {List<String> columns = mFilterColumns;columns.clear();if ((type & TYPE_RINGTONE) != 0) {columns.add(MediaStore.Audio.AudioColumns.IS_RINGTONE);}//add by xiangzaixiahsheng for support dual sim card ringtones  @{if ((type & TYPE_RINGTONE_2) != 0) {columns.add(MediaStore.Audio.AudioColumns.IS_RINGTONE);}//add by xiangzaixiansheng for support dual sim card ringtones  @}if ((type & TYPE_NOTIFICATION) != 0) {columns.add(MediaStore.Audio.AudioColumns.IS_NOTIFICATION);}if ((type & TYPE_ALARM) != 0) {columns.add(MediaStore.Audio.AudioColumns.IS_ALARM);}}private static String getSettingForType(int type) {if ((type & TYPE_RINGTONE) != 0) {return Settings.System.RINGTONE;} else if ((type & TYPE_NOTIFICATION) != 0) {return Settings.System.NOTIFICATION_SOUND;} else if ((type & TYPE_ALARM) != 0) {return Settings.System.ALARM_ALERT;//add by xiangzaixiansheng for support dual sim card ringtones  @{// } else if ((type & TYPE_MMS_NOTIFICATION) != 0) {//    return Settings.System.MMS_NOTIFICATION_SOUND;}else if ((type & TYPE_RINGTONE_2) != 0) {return Settings.System.RINGTONE_2;//add by xiangzaixiansheng for support dual sim card ringtones  @}} else {return null;}}public static Uri getCacheForType(int type, int userId) {if ((type & TYPE_RINGTONE) != 0) {return ContentProvider.maybeAddUserId(Settings.System.RINGTONE_CACHE_URI, userId);} 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);}    //add by xiangzaixainsheng for support dual sim card ringtones  @{else if ((type & TYPE_RINGTONE_2) != 0) {return ContentProvider.maybeAddUserId(Settings.System.RINGTONE_CACHE_URI_2, userId);//}else if ((type & TYPE_MMS_NOTIFICATION) != 0) {//    return ContentProvider.maybeAddUserId(Settings.System.MMS_NOTIFICATION_SOUND_CACHE_URI, userId);//add by xiangzaixiansheng for support dual sim card ringtones  @}}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;} 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;//add by xiangzaixiansheng for support dual sim card ringtones  @{} else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_RINGTONE_URI_2)) {return TYPE_RINGTONE_2;//  }else if (defaultRingtoneUri.equals(Settings.System.DEFAULT_MMS_NOTIFICATION_SOUND_URI)) {//    return TYPE_MMS_NOTIFICATION;//add by xiangzaixiansheng for support dual sim card ringtones  @}} else {return -1;}}public static Uri getDefaultUri(int type) {if ((type & TYPE_RINGTONE) != 0) {return Settings.System.DEFAULT_RINGTONE_URI;} 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;//add by xiangzaixiansheng for support dual sim card ringtones  @{} else if ((type & TYPE_RINGTONE_2) != 0) {return Settings.System.DEFAULT_RINGTONE_URI_2;// } else if ((type & TYPE_MMS_NOTIFICATION) != 0) {//     return Settings.System.DEFAULT_MMS_NOTIFICATION_SOUND_URI;//add by xiangzaixiansheng for support dual sim card ringtones  @}} else {return null;}}

路径:/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java

 public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {..........final String cacheRingtoneSetting;final String cacheName;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;} else if (Settings.System.ALARM_ALERT_CACHE_URI.equals(uri)) {cacheRingtoneSetting = Settings.System.ALARM_ALERT;cacheName = Settings.System.ALARM_ALERT_CACHE;//add by xiangzaixiansheng for support dual sim card ringtones  @{} else if (Settings.System.RINGTONE_CACHE_URI_2.equals(uri)) {cacheRingtoneSetting = Settings.System.RINGTONE_2;cacheName = Settings.System.RINGTONE_CACHE_2;//add by xiangzaixiansheng for support dual sim card ringtones @}} 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) {.......// Invalidate any relevant cache filesString cacheName = null;if (Settings.System.RINGTONE.equals(name)) {cacheName = Settings.System.RINGTONE_CACHE;} 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;//add by xiangzaixiansheng for support dual sim card ringtones  @{}else if (Settings.System.RINGTONE_2.equals(name)) {cacheName = Settings.System.RINGTONE_CACHE_2;// }else if (Settings.System.MMS_NOTIFICATION_SOUND.equals(name)) {//    cacheName = Settings.System.MMS_NOTIFICATION_SOUND_CACHE;//add by xiangzaixiansheng for support dual sim card ringtones  @}}if (cacheName != null) {final File cacheFile = new File(getRingtoneCacheDir(owningUserId), cacheName);cacheFile.delete();}
}

路径:/frameworks/base/core/res/res/values/attrs.xml

 <!-- add by xiangzaixiansheng for support dual sim card ringtones --><!-- Ringtones. --><flag name="ringtone_2" value="32" />
<!-- add by xiangzaixiansheng for support dual sim card ringtones  -->

三、来电监听

这一步做的主要是区分 那个SIM卡来电,并播放相应铃声

路径:/vendor/mediatek/proprietary/packages/services/Telecomm/src/com/android/server/telecom/RingtoneFactory.java

import android.telecom.PhoneAccountHandle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import com.android.internal.telephony.PhoneConstants;public Ringtone getRingtone(Call incomingCall) {...........if(ringtoneUri != null && userContext != null) {// Ringtone URI is explicitly specified. First, try to create a Ringtone with 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.Context contextToUse = hasDefaultRingtoneForUser(userContext) ? userContext : mContext;Uri defaultRingtoneUri;if (UserManager.get(contextToUse).isUserUnlocked(contextToUse.getUserId())) {defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,RingtoneManager.TYPE_RINGTONE);//add by xiangzaixiansheng for support dual sim card ringtones  @{int slotId = getSlotId(mContext,incomingCall.getTargetPhoneAccount());if (slotId == PhoneConstants.SUB2) {defaultRingtoneUri = RingtoneManager.getActualDefaultRingtoneUri(contextToUse,RingtoneManager.TYPE_RINGTONE_2);}//add by xiangzaixiansheng for support dual sim card ringtones @}} else {defaultRingtoneUri = Settings.System.DEFAULT_RINGTONE_URI;}
.........
}private int getSlotId(Context context, PhoneAccountHandle phoneAccountHandle) {int slotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;SubscriptionManager sm = SubscriptionManager.from(mContext);List<SubscriptionInfo> subInfoList = sm.getActiveSubscriptionInfoList();if (phoneAccountHandle != null && !TextUtils.isEmpty(phoneAccountHandle.getId())&& subInfoList != null) {for (SubscriptionInfo subInfo : subInfoList) {if (phoneAccountHandle.getId().startsWith(subInfo.getIccId())) {slotIndex = subInfo.getSimSlotIndex();}}}return slotIndex;}

四、Setting中的设置

这里面其实比较简单,只要模仿SIM卡1来添加就可以了

路径:/packages/apps/Settings/res/xml/sound_settings.xml

<com.android.settings.DefaultRingtonePreferenceandroid:key="ringtone2"android:title="@string/ringtone_title"android:dialogTitle="@string/ringtone_title"android:summary="@string/summary_placeholder"android:ringtoneType="ringtone_2" />

路径:/packages/apps/Settings/src/com/android/settings/notification/SoundSettings.java

 private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,SoundSettings fragment, VolumeSeekBarPreference.Callback callback,Lifecycle lifecycle) {final List<AbstractPreferenceController> controllers = new ArrayList<>();controllers.add(new ZenModePreferenceController(context));controllers.add(new EmergencyBroadcastPreferenceController(context, KEY_CELL_BROADCAST_SETTINGS));controllers.add(new VibrateWhenRingPreferenceController(context));// === Volumes ===controllers.add(new AlarmVolumePreferenceController(context, callback, lifecycle));controllers.add(new MediaVolumePreferenceController(context, callback, lifecycle));controllers.add(new NotificationVolumePreferenceController(context, callback, lifecycle));controllers.add(new RingVolumePreferenceController(context, callback, lifecycle));// === Phone & notification ringtone ===controllers.add(new PhoneRingtonePreferenceController(context));//add by xiangzaixiansheng for support dual sim card ringtones  @{controllers.add(new PhoneRingtone2PreferenceController(context));//add by xiangzaixiansheng for support dual sim card ringtones  @}controllers.add(new AlarmRingtonePreferenceController(context));controllers.add(new NotificationRingtonePreferenceController(context));
......
}

路径:/packages/apps/Settings/src/com/android/settings/notification/PhoneRingtone2PreferenceController.java

package com.android.settings.notification;import android.content.Context;
import android.media.RingtoneManager;import com.android.settings.Utils;public class PhoneRingtone2PreferenceController extends RingtonePreferenceControllerBase {private static final String KEY_PHONE_RINGTONE_2 = "ringtone2";String sim2 = "";public PhoneRingtone2PreferenceController(Context context) {super(context);}@Overridepublic String getPreferenceKey() {return KEY_PHONE_RINGTONE_2;}@Overridepublic boolean isAvailable() {if(simNumberCard == 0) {return false;} else if (simNumberCard ==1 ) {return isShowSim();} else if (simNumberCard == 2) {return Utils.isVoiceCapable(mContext);}       return Utils.isVoiceCapable(mContext);}public boolean isShowSim(){sim2=getSimName(1);if(sim2 !=  null && sim2 !="" && !sim2.equals("")) {return Utils.isVoiceCapable(mContext);} else {return false;}}@Overridepublic int getRingtoneType() {return RingtoneManager.TYPE_RINGTONE_2;}
}

路径:/packages/apps/Settings/src/com/android/settings/notification/RingtonePreferenceControllerBase.java

这个里面需要配置的一些何时会显示SIM卡铃声选项显示的时机。例如我们的需求就是如果没有SIM卡2就不显示SIM卡2的铃声设置选项。这里面我们就忽略这些操作了。这里面就给出一个方法,如果获得当前卡槽的SIM卡信息。

   public  String getSimName(int phoneId) {mSubInfoList = mSubscriptionManager.getActiveSubscriptionInfoList();for (SubscriptionInfo info : mSubInfoList) {if (null != info && phoneId == info.getSimSlotIndex() &&null != info.getDisplayName() && !"".equals(info.getDisplayName())) {return info.getDisplayName().toString();}}return "";}

Android系统双卡铃声实现相关推荐

  1. HTC Desire A8181 的Android系统闹铃声音的修改

    HTC Desire A8181 的Android系统闹铃声音的修改 @for & ever 2010-5-3 试了半天想要修改Desire的闹铃,但是发现只能使用原始的几个音乐文件. 网上查 ...

  2. Android 系统默认铃声修改 添加删除铃声

    Android 7.0 修改系统默认铃声: build\target\product\full_base.mk ro.config.ringtone=14_Snowflakes.ogg \ ro.co ...

  3. Android代码双卡切换,Android添加双卡铃声设置的方法

    安卓本身并不支持双卡,在定制过之后,默认情况下两张卡的来电铃声是一样的,不能分别进行设置,这就需要添加一些相关代码. 基本思路是,找到来电时播放铃声的地方,修改为根据卡的ID播放相应的声音.(而整个来 ...

  4. android系统默认铃声,android播放系统默认的铃声

    播放默认通知声音 /** * 播放系统默认提示音 * * @return MediaPlayer对象 * * @throws Exception */ public void defaultMedia ...

  5. android系统默认铃声,Android系统修改默认铃声

    Andriod手机的铃声默认保存在system/media/audio/下面,有四个文件夹,分别是alarms,notifications,ringtones,ui.对应闹钟.通知.铃声.UI音效.r ...

  6. android 双卡铃声设置在哪里,Android(安卓)手机铃声设置方法

    Android(安卓)手机铃声(自选)是如何设置的 铃声设置很简单,一般Android手机具有四种铃声可以设置 分别为:来电.短信.闹钟.系统等种类铃声 具体的设置方法为: 1.首先打开Android ...

  7. android 系统声音文件对应目录

    首先说明这是转载滴... 原文并没有作者,所以..... 淡定的分割线----------------------------------------------------------------- ...

  8. Android 双卡铃声设置

    关于来电铃声设置 目前Android原生系统只有一个铃声设置,即单卡铃声,项目中有双卡支持的需求,自然就需要能够进行双卡铃声的支持,本文不考虑双卡的实现,只针对双卡铃声的设置,谈一谈双卡下Settin ...

  9. 获取android系统手机的铃声和音量

    获取android系统手机的铃声和音量 通过程序 获取android系统手机的铃声和音量.设置音量的方法也很简单,AudioManager提供了方法: publicvoidsetStreamVolum ...

最新文章

  1. ANTS医学影像配准+Li‘s 核磁共振影像数据处理
  2. 1001. [BJOI2006]狼抓兔子【最小割】
  3. linux怎么重命名多个文件,在Linux中如何一次重命名多个文件详解
  4. vue动态绑定class,tab切换非常好用
  5. jQuery easyUI--选项卡右键菜单
  6. ajax实现两个aspx跳转,请问ajax执行成功后可以跳转到另一个页面吗?
  7. javascript嵌套函数和在函数内调用外部函数的区别
  8. Fabric node sdk 1.4简明教程
  9. HDUOJ3549 - Flow Problem(网络流+最大流最小割+模板)
  10. iOS 不规则的ImageView
  11. PHP的图片等比缩放
  12. tgp饥荒搭建服务器证书,饥荒:联机版服务器搭建方法 搭建TGP专属服务器教程_3DM单机...
  13. 创建列表、删除列表、查看列表长度、列表增加一个元素的几种方法
  14. 删除google网页快照方法
  15. vue怎么制作甘特图——dhtmlx-gantt
  16. 扫描仪软件测试自学,资讯详情-静态代码扫描工具 - sonarQube-柠檬班-自动化测试-软件测试培训-自学官网...
  17. 基于ESP8266+华为云数据监控模块
  18. 企业能源管控平台在钢铁行业能源管理中的应用
  19. 《中国计算机报 停刊,《中国计算机报》硬件之星“最具超值”产品:捷波J-865PEDA...
  20. RRDTOOL 学习

热门文章

  1. 怎么调整html超链接,HTML超链接怎么设置
  2. C# 获取当前桌面路径
  3. DESFire EV1 CRC32的原理与VB .Net实现
  4. 微信小程序-双滑块组件
  5. 数据结构课程(一)报数问题:有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……
  6. 嵌入式开发——基于小熊派的智慧农业案例(二)
  7. 玩酷的vimperator教程 火狐firefox的VIM插件[转]
  8. CentOS8中使用Libreoffice7.3遇到的问题
  9. 爬虫系列:在 Python 中用 Selenium 执行 Javascript
  10. 如何彻底删除VMware虚拟机