基于Android 6.0修改的音乐播放器可设置卡1卡2铃声

Android 音量控制实战:从基础设置到按键监听 本文深入探讨Android多媒体开发中的音量控制实战,核心围绕AudioManager与STREAM_MUSIC媒体流展开。详细讲解了如何获取与显示音量信息,对比setStreamVolume精准设置与adjustStreamVolume步进调整两种方法,并提供了监听物理音量按键的进阶方案与避坑指南,帮助开发者构建体验良好的音效管理功能。 阅读详情
--- a/alps/frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/alps/frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -43,6 +43,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
+import android.os.SystemProperties;
+
 import static android.os.Process.FIRST_APPLICATION_UID;
 
 /**
@@ -612,6 +614,9 @@ final class DefaultPermissionGrantPolicy {
 			/*  removed for xts testDefaultGrants test at 20160627
 				Music close STORAGE_PERMISSIONS by default */
             //  grantRuntimePermissionsLPw(musicPackage, STORAGE_PERMISSIONS, userId);
+				 if (SystemProperties.get("ro.music_multisim_ringtone").equals("1")){  
+					grantRuntimePermissionsLPw(musicPackage, PHONE_PERMISSIONS, userId);
+				 }
             }
 
             mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
diff --git a/alps/packages/apps/Music/res/values-fr/strings.xml b/alps/packages/apps/Music/res/values-fr/strings.xml
old mode 100644
new mode 100755
index 5168838..4d31478
--- a/alps/packages/apps/Music/res/values-fr/strings.xml
+++ b/alps/packages/apps/Music/res/values-fr/strings.xml
@@ -150,4 +150,7 @@
     <string name="fast_scroll_alphabet" msgid="5548732936480723311">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="widget_initial_text" msgid="3166878738860903586">"Appuyez pour sélectionner des titres"</string>
     <string name="effectspanel" msgid="8804547581593509614">"Effets sonores"</string>
+	
+	 <string name="ringtone_as_sim1_menu">utilisation comme sim1 sonnerie</string>
+    <string name="ringtone_as_sim2_menu">utilisation comme sim2 sonnerie</string>
 </resources>
\ No newline at end of file
diff --git a/alps/packages/apps/Music/res/values-zh-rCN/strings.xml b/alps/packages/apps/Music/res/values-zh-rCN/strings.xml
old mode 100644
new mode 100755
index 8abea51..df7615f
--- a/alps/packages/apps/Music/res/values-zh-rCN/strings.xml
+++ b/alps/packages/apps/Music/res/values-zh-rCN/strings.xml
@@ -153,4 +153,7 @@
     <string name="fast_scroll_alphabet" msgid="5548732936480723311">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
     <string name="widget_initial_text" msgid="3166878738860903586">"触摸可选择音乐。"</string>
     <string name="effectspanel" msgid="8804547581593509614">"音效"</string>
+	
+	 <string name="ringtone_as_sim1_menu">用作SIM1手机铃声</string>
+    <string name="ringtone_as_sim2_menu">用作SIM2手机铃声</string>
 </resources>
diff --git a/alps/packages/apps/Music/res/values/strings.xml b/alps/packages/apps/Music/res/values/strings.xml
old mode 100644
new mode 100755
index 37e5a4c..c94f1c3
--- a/alps/packages/apps/Music/res/values/strings.xml
+++ b/alps/packages/apps/Music/res/values/strings.xml
@@ -314,5 +314,8 @@
 
     <!-- shown as the message if user deny storage read permission  -->
     <string name="music_storage_permission_deny">Permission denied. You can change permissions in Settings->Apps.</string>
+	
+	 <string name="ringtone_as_sim1_menu">Use as SIM1 ringtone</string>
+    <string name="ringtone_as_sim2_menu">Use as SIM2 ringtone</string>
 </resources>
--- a/alps/packages/apps/Music/src/com/android/music/MediaPlaybackActivity.java
+++ b/alps/packages/apps/Music/src/com/android/music/MediaPlaybackActivity.java
@@ -85,6 +85,13 @@ import android.widget.Toast;
 import com.android.music.MusicUtils.ServiceToken;
 import com.mediatek.drm.OmaDrmStore;
 
+// start modify Music MultiSim
+import android.telephony.TelephonyManager;
+import android.telephony.SubscriptionManager;
+import android.os.SystemProperties;
+import java.util.List;
+import android.content.pm.PackageManager;
+import android.Manifest;
+// end modify Music MultiSim
+
 public class MediaPlaybackActivity extends Activity implements MusicUtils.Defs,
     View.OnTouchListener, View.OnLongClickListener, CreateBeamUrisCallback
 {
@@ -709,8 +716,25 @@ public class MediaPlaybackActivity extends Activity implements MusicUtils.Defs,
 
             if (UserHandle.myUserId() == UserHandle.USER_OWNER) {
                 if (MusicUtils.isVoiceCapable(this)) {
+					//start modify Music MultiSim 
+				  if(SystemProperties.get("ro.mtk_audio_profiles").equals("1") && SystemProperties.get("ro.music_multisim_ringtone").equals("1") && hasPhonePermission()){
+					final TelephonyManager mTeleManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
+					int simNum = SubscriptionManager.from(this).getActiveSubscriptionInfoCount();
+					MusicLogUtils.d(TAG, "simNum:" + simNum);
+				 
+					if(simNum==2){
+						 menu.add(0, USE_AS_SIM1_RINGTONE, 0, R.string.ringtone_as_sim1_menu).setIcon(
+							R.drawable.ic_menu_set_as_ringtone);
+						 menu.add(0, USE_AS_SIM2_RINGTONE, 0, R.string.ringtone_as_sim2_menu).setIcon(
+							R.drawable.ic_menu_set_as_ringtone);
+					  }else {
+						 menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu_short).setIcon(
+							R.drawable.ic_menu_set_as_ringtone);
+					  }
+				  }else
+				//end modify Music MultiSim
                     menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu_short).setIcon(
-                             R.drawable.ic_menu_set_as_ringtone);
+                             R.drawable.ic_menu_set_as_ringtone);							 
                 }
             }
 
@@ -787,16 +811,53 @@ public class MediaPlaybackActivity extends Activity implements MusicUtils.Defs,
             /// M: DRM feature, when track is drm and not FL type, it can not set as ringtone. {@
             if (MusicFeatureOption.IS_SUPPORT_DRM && MusicUtils.isVoiceCapable(this)) {
                 try {
-                    menu.findItem(USE_AS_RINGTONE).setVisible(mService.canUseAsRingtone());
+					//MultiSim begin
+					  if(SystemProperties.get("ro.mtk_audio_profiles").equals("1") && SystemProperties.get("ro.music_multisim_ringtone").equals("1") && hasPhonePermission()){
+							final TelephonyManager mTeleManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
+							int simNum = SubscriptionManager.from(this).getActiveSubscriptionInfoCount();
+							MusicLogUtils.d(TAG, "Prepare simNum:" + simNum);
+							if(simNum==2){
+								menu.findItem(USE_AS_SIM1_RINGTONE).setVisible(mService.canUseAsRingtone());
+								menu.findItem(USE_AS_SIM2_RINGTONE).setVisible(mService.canUseAsRingtone());
+							}else
+								menu.findItem(USE_AS_RINGTONE).setVisible(mService.canUseAsRingtone());
+					
+					  }else
+					//MultiSim end
+					  menu.findItem(USE_AS_RINGTONE).setVisible(mService.canUseAsRingtone());
                 } catch (RemoteException e) {
                     MusicLogUtils.e(TAG, "onPrepareOptionsMenu with RemoteException " + e);
                 }
             }
         } else {
-            MenuItem ringtoneItem = menu.findItem(USE_AS_RINGTONE);
-            if (ringtoneItem != null) {
-                ringtoneItem.setVisible(false);
-            }
+			//MultiSim begin
+					  if(SystemProperties.get("ro.mtk_audio_profiles").equals("1") && SystemProperties.get("ro.music_multisim_ringtone").equals("1") && hasPhonePermission()){
+					final TelephonyManager mTeleManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
+					int simNum = SubscriptionManager.from(this).getActiveSubscriptionInfoCount();
+					MusicLogUtils.d(TAG, "Prepare simNum:" + simNum);
+					if(simNum==2){
+						MenuItem ringtoneItem1 = menu.findItem(USE_AS_SIM1_RINGTONE);
+						MenuItem ringtoneItem2 = menu.findItem(USE_AS_SIM2_RINGTONE);
+						if (ringtoneItem1 != null) {
+							ringtoneItem1.setVisible(false);
+						}
+						if (ringtoneItem2 != null) {
+							ringtoneItem2.setVisible(false);
+						}
+					}else{
+						MenuItem ringtoneItem = menu.findItem(USE_AS_RINGTONE);
+						if (ringtoneItem != null) {
+							ringtoneItem.setVisible(false);
+						}
+					}
+			  }else
+			//MultiSim end
+			{	
+				MenuItem ringtoneItem = menu.findItem(USE_AS_RINGTONE);
+				if (ringtoneItem != null) {
+					ringtoneItem.setVisible(false);
+				}
+			}
         }
         /**@}**/
         /// M: Set effect menu visible depend the effect class whether disable or enable. {@
@@ -790,6 +793,17 @@ public class MediaPlaybackActivity extends Activity implements MusicUtils.Defs,
         }
         return false;
     }
+	
+	//add
+	private boolean hasPhonePermission(){
+		int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.READ_PHONE_STATE);
+		if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED){ 
+			return false;
+		}
+		else{
+			return true;
+		}
+	}
@@ -866,13 +927,39 @@ public class MediaPlaybackActivity extends Activity implements MusicUtils.Defs,
                     startActivity(intent);
                     finish();
                     break;
-                case USE_AS_RINGTONE: {
+              case USE_AS_RINGTONE: {
                     // Set the system setting to make this the current ringtone
-                    if (mService != null) {
-                        MusicUtils.setRingtone(this, mService.getAudioId());
+				   if (mService != null) {				
+						//start modify Music MultiSim
+					/**/	if (SystemProperties.get("ro.music_multisim_ringtone").equals("1") && hasPhonePermission()){
+							int[] mSubIdList = SubscriptionManager.from(this).getActiveSubscriptionIdList();
+							MusicUtils.setRingtone(this, mService.getAudioId(),mSubIdList[0]);
+						}else
+						//end modify Music MultiSim
+                    MusicUtils.setRingtone(this, mService.getAudioId(),-1);
                     }
                     return true;
                 }
+				//start modify Music MultiSim
+			 	case USE_AS_SIM1_RINGTONE: {
+				 	// Set the system setting to make this the current ringtone
+				 /*	*/if (mService != null) {
+						 int subId=SubscriptionManager.getSubId(0)[0];
+						 MusicLogUtils.d(TAG, "onOptionsItemSelected +++ subId= " + subId);
+						 MusicUtils.setRingtone(this, mService.getAudioId(),subId);
+					  }
+				return true;
+				}
+				case USE_AS_SIM2_RINGTONE: {
+					// Set the system setting to make this the current ringtone
+					if (mService != null) {
+						   int subId=SubscriptionManager.getSubId(1)[0];
+						   MusicLogUtils.d(TAG, "onOptionsItemSelected ++ subId= " + subId);
+						   MusicUtils.setRingtone(this, mService.getAudioId(),subId);
+						} /*  */
+					return true;
+					}
+					//end modify Music MultiSim
                 case PARTY_SHUFFLE:
                     MusicUtils.togglePartyShuffle();
                     setShuffleButtonImage();
diff --git a/alps/packages/apps/Music/src/com/android/music/MusicUtils.java b/alps/packages/apps/Music/src/com/android/music/MusicUtils.java
old mode 100644
new mode 100755
index 562a67d..d53ed1e
--- a/alps/packages/apps/Music/src/com/android/music/MusicUtils.java
+++ b/alps/packages/apps/Music/src/com/android/music/MusicUtils.java
@@ -86,6 +86,14 @@ import android.widget.Toast;
 
 import android.telephony.TelephonyManager;
 
+//start modify Music MultiSim
+import android.telephony.TelephonyManager;
+import com.mediatek.audioprofile.AudioProfileManager;
+import android.os.SystemProperties;
+import android.telephony.SubscriptionManager;
+//end modify Music MultiSim
+ 
+
 public class MusicUtils {
 
     private static final String TAG = "MusicUtils";
@@ -136,7 +144,12 @@ public class MusicUtils {
         public final static int FM_TRANSMITTER = 14;
         /// M: add for drm
         public final static int DRM_INFO = 15;
-        public final static int CHILD_MENU_BASE = 16; // this should be the last item
+		//start modify Music MultiSim
+		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 = 18; // this should be the last item
+		//  public final static int CHILD_MENU_BASE = 16; // this should be the last item
+		//end modify Music MultiSim
         /**M: Add Hotknot menu.@{**/
         public final static int HOTKNOT = CHILD_MENU_BASE + 10;
         /**@}**/
@@ -1330,7 +1343,7 @@ public class MusicUtils {
         SharedPreferencesCompat.apply(ed);
     }
 
-    static void setRingtone(Context context, long id) {
+    static void setRingtone(Context context, long id,int slotId /* modify Music MultiSim */) {
         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);
@@ -1360,6 +1373,21 @@ public class MusicUtils {
             if (cursor != null && cursor.getCount() == 1) {
                 // Set the system setting to make this the current ringtone
                 cursor.moveToFirst();
+				//start modify Music MultiSim
+				if(SystemProperties.get("ro.music_multisim_ringtone").equals("1")){
+					AudioProfileManager mProfileManager = (AudioProfileManager) context.getSystemService(Context.AUDIO_PROFILE_SERVICE);
+					String mActiveProfileKey = mProfileManager.getActiveProfileKey();
+					final TelephonyManager mTeleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+					if(slotId == -1){
+						Settings.System.putString(resolver, Settings.System.RINGTONE, ringUri.toString());
+						MusicLogUtils.d(TAG, "setRingtone: "  + "slotId is null" + ", ringUri= "+ringUri);
+
+					}else {
+						MusicLogUtils.d(TAG, "setRingtone:  "  + "slotId = " + slotId + ", ringUri= "+ringUri);
+						mProfileManager.setRingtoneUri(mActiveProfileKey, AudioProfileManager.TYPE_RINGTONE, slotId, ringUri);
+					}	
+				}else
+				//end modify Music MultiSim
                 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();
diff --git a/alps/packages/apps/Music/src/com/android/music/TrackBrowserActivity.java b/alps/packages/apps/Music/src/com/android/music/TrackBrowserActivity.java
old mode 100644
new mode 100755
index 772743a..24971a4
--- a/alps/packages/apps/Music/src/com/android/music/TrackBrowserActivity.java
+++ b/alps/packages/apps/Music/src/com/android/music/TrackBrowserActivity.java
@@ -91,6 +91,16 @@ import com.mediatek.drm.OmaDrmUiUtils;
 //import java.text.Collator;
 import java.util.Arrays;
 
+
+// start modify Music MultiSim
+import android.telephony.TelephonyManager;
+import android.telephony.SubscriptionManager;
+import android.os.SystemProperties;
+import android.telephony.SubscriptionInfo; 
+import java.util.List;
+import android.content.pm.PackageManager;
+import android.Manifest;
+// end modify Music MultiSim
+
+
 public class TrackBrowserActivity extends ListActivity
         implements View.OnCreateContextMenuListener, MusicUtils.Defs,
          ServiceConnection, DialogInterface.OnClickListener
@@ -936,6 +938,16 @@ public class TrackBrowserActivity extends ListActivity
         }
         return ismusic;
     }
+	
+	
+	//add
+	private boolean hasPhonePermission(){
+		int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.READ_PHONE_STATE);
+		if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) 
+			return false;
+		else
+			return true;
+	}
@@ -958,10 +968,34 @@ public class TrackBrowserActivity extends ListActivity
                 int drmMethod = mTrackCursor.getInt(mTrackCursor.getColumnIndexOrThrow
                 (MediaStore.Audio.Media.DRM_METHOD));
                 if (isVoiceCapable && canDispalyRingtone(isDrm, drmMethod)) {
+					//start modify Music MultiSim
+					final TelephonyManager mTeleManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
+					int simNum = SubscriptionManager.from(this).getActiveSubscriptionInfoCount();
+					MusicLogUtils.d(TAG, "simNum---------:" + simNum);
+					if(SystemProperties.get("ro.music_multisim_ringtone").equals("1") && hasPhonePermission()){
+						final TelephonyManager mTeleManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
+						int simNum = SubscriptionManager.from(this).getActiveSubscriptionInfoCount();
+						if(simNum==2){
+							menu.add(0, USE_AS_SIM1_RINGTONE, 0, R.string.ringtone_as_sim1_menu);//ringtone_as_sim1_menu
+							menu.add(0, USE_AS_SIM2_RINGTONE, 0,       R.string.ringtone_as_sim2_menu);//ringtone_as_sim2_menu
+						}else {
+							menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
+						}
+					}else //end modify Music MultiSim
                     menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
                 }
             } else {
                 if (isVoiceCapable) {
+					//start modify Music MultiSim
+					final TelephonyManager mTeleManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
+					int simNum = SubscriptionManager.from(this).getActiveSubscriptionInfoCount();
+					MusicLogUtils.d(TAG, "simNum-----:" + simNum);
+					if(SystemProperties.get("ro.music_multisim_ringtone").equals("1") && hasPhonePermission()){
+						final TelephonyManager mTeleManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
+						int simNum = SubscriptionManager.from(this).getActiveSubscriptionInfoCount();
+						if(simNum==2){
+							menu.add(0, USE_AS_SIM1_RINGTONE, 0, R.string.ringtone_as_sim1_menu);//ringtone_as_sim1_menu
+							menu.add(0, USE_AS_SIM2_RINGTONE, 0, R.string.ringtone_as_sim2_menu);//ringtone_as_sim2_menu
+						}else if(simNum==1){
+							menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
+					  }
+				   }else //end modify Music MultiSim
                     menu.add(0, USE_AS_RINGTONE, 0, R.string.ringtone_menu);
                 }
             }
@@ -1048,8 +1082,29 @@ public class TrackBrowserActivity extends ListActivity
 
             case USE_AS_RINGTONE:
                 // Set the system setting to make this the current ringtone
-                MusicUtils.setRingtone(this, mSelectedId);
+				//start modify Music MultiSim
+				 if (SystemProperties.get("ro.music_multisim_ringtone").equals("1") && hasPhonePermission()){ 
+					  int[] mSubIdList = SubscriptionManager.from(this).getActiveSubscriptionIdList(); 
+					  MusicUtils.setRingtone(this,mService.getAudioId(),mSubIdList[0]);
+				  }else/* */
+				//end modify Music MultiSim
+                MusicUtils.setRingtone(this, mSelectedId,-1);
                 return true;
+				
+				//start modify Music MultiSim
+			  case USE_AS_SIM1_RINGTONE:
+			// Set the system setting to make this the current ringtone1
+				  int subId=SubscriptionManager.getSubId(0)[0];
+				  MusicLogUtils.d(TAG, "onContextItemSelected subId= " + subId);
+				  MusicUtils.setRingtone(this, mSelectedId,subId);
+				  return true;
+			  case USE_AS_SIM2_RINGTONE:
+			// Set the system setting to make this the current ringtone2
+				  int subId1=SubscriptionManager.getSubId(1)[0];
+				  MusicLogUtils.d(TAG, "onContextItemSelected subId= " + subId1);
+				  MusicUtils.setRingtone(this, mSelectedId,subId1);
+				  return true;
+			//end modify Music MultiSim
 
             case DELETE_ITEM: {
                 long [] list = new long[1];

 

Cisco三层交换机的详细配置 ** 本文适用于新手小白以及微微基础的同学来用于参考,实验是在Cisco Packet Tracer Student 进行,实验最终效果如图所示,所有命令配置与图中的一致。 使用到的机器型号为:五台电脑,一台服务器,三个普通交换机(2960型号),一个三层交换机(3560-24PS),两台普通服务器(2811) 文章目录一、什么是三层交换机二、配置交换机步骤1.配置二层交换机2.配置三层交换机3.配置两台路由器以及最后一台电脑 一、什么是三层交换机 1.三层交换机 = 三层路由+二层交换机 2.工作在 阅读详情

相关推荐

锐捷交换机路由器配置全攻略:从基础命令到高级功能(附常用命令速查表)

本文提供锐捷交换机路由器配置全攻略,涵盖从基础命令到高级功能的详细指南,包括VLAN划分、DHCP配置、链路聚合等实用技巧,并附常用命令速查表,帮助网络管理员快速掌握锐捷设备运维。

weixin_29285605的博客 519

浏览网页出现乱码

     大家可能遇到这种情况,浏览一个网页会出现乱码,也就是除了图片以外会出现乱码。出现乱码的原因。 .      浏览器不支持网页的编码。这种情况比较常见。比如IE6的浏览器于遨游浏览同一网页,会出现显示不完整、乱码。当然同一浏览器的不同版本也有类似情况。IE6与IE8浏览器有些网页也会出现乱码、显示不全。       先分享一个我看过的网页内容。   

tiantian6036的专栏 67万+

电子元器件基础:电阻、电容、电感的特性与应用解析

本文深入解析了电子元器件中电阻、电容和电感三大基础元件的核心特性、工作原理与选型应用。电阻作为电路中的‘交通警察’,控制电流与分配电压,其额定功率与精度是关键选型参数。文章结合实战经验,详细阐述了它们在电源滤波、信号处理及高频电路中的不同表现与避坑指南,是电子设计与维修的必备基础知识。

weixin_29213655的博客 379

乐乐音乐6.0全新改版-支持制作歌词

简介 乐乐音乐6.0主要是基于ijkplayer框架开发的Android音乐播放器,它支持多种音频格式和动感歌词及制作动感歌词、翻译歌词和音译歌词。 运行环境 android5.0及以上 音频格式 目前用ijkplayer来测试如下音频格式,均可正常播放:aac,amr,ape,flac,m4r,mmf,mp2,mp3,ogg,wav,wma,wv 歌词格式 lrc:普通歌词、 krc:酷狗歌词 ...

aakzhangliangming的专栏 838

手撕代码系列:Conv2D

在实际的神经网络中,每个卷积核都会对应一个偏置值。这意味着如果网络有多个卷积核,每个卷积核的输出都可以加上对应的偏置。

qq_55794606的博客 911

手把手教你用RSoft BPM仿真一个1x2光分束器:从参数设置到结果分析全记录

本文详细介绍了使用RSoft BPM模块设计和仿真1×2光分束器的完整流程,包括参数设置、结构建模、仿真配置和结果分析。通过实战指南,帮助读者掌握光波导器件的仿真技术,实现50:50功率分配的设计目标,适用于光通信和集成光学领域的研究与应用。

weixin_30545945的博客 546

Android6.0系统适配桌面歌词效果

github地址:https://github.com/coolstar1204/ActivityShowHide在360手机助手及各家的音乐播放器软件上,都使用了桌面浮动窗功能,桌面歌词都是在音乐客户端显示在前台时隐藏,在用户把软件切换到后台后显示出来,此效果在Android 6.0以前,大部分都是使用系统的ActivityManager系统类的getRunningAppProcesses或get

coolstar1204的专栏 2627

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码)

本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。

weixin_29231725的博客 1384

Android平台实现卡1卡2铃声分开设置

Android从5.0之后开始支持双卡,但手机铃声不能分开设置,要实现此功能,可参考默认铃声增加一项,来电时根据sim卡获取对应的设置项即可。 文件frameworks/base/core/java/android/provider/Settings.java 中定义了铃声key以及对应的URI,铃声备份文件以及对应的URI。 参考默认铃声增加如下代码: //卡2铃声key,保存在文件/data/...

weixin_42935803的博客 4196

Zabbix7.0+DeepSeek大模型实现人工智能告警分析

本方案基于Zabbix7.0监控系统,通过底层webhook脚本机制集成Deepseek做故障分析提供解决方案,构建智能化运维体系。

xingdiango的博客 2374

Coze智能体实战:接口需求分析和接口调试

AI智能体的需求:能根据接口文档提取接口信息以及设计接口测试点,并进行接口调试返回接口测试结果。

十二测试录 283

[FAQ10001][Audio Profile]打开双卡铃声设置功能后,设置卡1,卡2的铃声之后,将两张卡交换卡槽,铃声也会交换

[DESCRIPTION]   1,打开MTK_MULTSIM_RINGTONE_SUPPORT,即打开双卡来电铃声分别设置的功能; 2,卡槽1和卡槽2分别插SIMA和SIMB,设置卡1的铃声为aaa,设置卡2的铃声为bbb; 3,关机,将2张sim卡互换卡槽,即SIMA插在卡槽2,SIMB插在卡槽1上; 4,开机,进入情境模式查看来电铃声,卡1显示的是bbb,卡2显

明日暘炚 1196

让 SAP HANA 查询飞起来:彻底避开隐式类型转换的性能暗礁

SAP HANA性能优化:警惕隐式类型转换陷阱 隐式类型转换是SAP HANA项目中常见的性能隐患。当SQL表达式两侧数据类型不匹配时,系统会自动进行类型转换,这种看似便利的操作可能导致: 过滤条件无法下推,扫描范围扩大 列存引擎优势丧失,触发中间结果物化 执行计划走向低效路径 治理方案包括: 从源头统一数据类型,确保常用比较字段类型一致 将显式转换应用于常量而非整列 使用生成列预先转换存储,避免运行时计算 排查方法: 通过SQL Plan Cache定位高频查询 分析执行计划中的转换迹象 重点关注VARC

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 11万+

Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果

目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放。 Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果。 如果要实现这个效果,首先要搞清楚两大问题; 1、来电时的代码主要实现流程。 2、主流音乐播放器在播放过程中,如果有来电,到底在收到了什么事件后将音乐暂停了? 一:来电时的代码

sevedk的专栏 1534

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android SDcard

最近做个音乐播放器的项目,其中全盘扫描功能,通过扫描手机根目录下的文件路径(过滤掉系统目录)完成歌曲扫描。但是在4.1系统的手机歌曲被扫描的两次,确认歌曲只保存了一份。 仔细查看android系统根目录(\)下的文件夹: 4.1以下版本: 系统目录下存在两个sdcard,也就是储存卡。mnt是安卓unix传统系统下挂载外部设备的专用目录,mnt/sdcard是实际的文件所在的地方

chen4ad的专栏 338

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android4.1 SDcard路径问题

最近做个音乐播放器的项目,其中全盘扫描功能,通过扫描手机根目录下的文件路径(过滤掉系统目录)完成歌曲扫描。但是在4.1系统的手机歌曲被扫描的两次,确认歌曲只保存了一份。 仔细查看android系统根目录(\)下的文件夹: 4.1以下版本: 系统目录下存在两个sdcard,也就是储存卡。mnt是安卓unix传统系统下挂载外部设备的专用目录,mnt/sdcard是实际的文件所在的地方,/sdca

houli1314521126com的专栏 882

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android本地音乐播放器开发实战:从权限申请到播放控制

本文详细介绍了Android本地音乐播放器的开发实战,从动态权限申请、文件扫描到使用MediaPlayer进行核心播放控制。文章提供了完整的源码示例,涵盖播放、暂停、停止及生命周期管理,并探讨了进度条、后台播放等扩展功能,帮助开发者快速构建稳定的本地音频播放模块。

t1u2v的博客 699

Android音频开发实战:正确设置音量与AudioStream的关联与优化

蓝牙设备同步问题现象:手机音量已调大,但蓝牙耳机音量不变解决方案:通过判断设备类型,使用代替绝对音量设置焦点回调中的禁忌// 错误示范:可能引发焦点震荡audioManager.setStreamVolume(...) // 危险操作!// 正确做法:使用Handler异步处理handler.post { /* 安全处理逻辑 */ }控制流与焦点的相爱相杀成功后,音量键调节依然无效会覆盖焦点系统的音量控制权。

2600_94959974的博客 1011

android AudioManager AUDIOFOCUS

现在开始做音乐播放器的模块,遇到了几个问题 当播放音乐的过程中,去调节音量或者情景模式中的铃声设置,结果会有两种声音同时响起。引起此问题的原因是音乐焦点问题没弄清 现分析一下音乐焦点的几个属性:源码在frameworks/base/media/java/andorid/media/AudioManager.java中 public static final int AUDIOFOCU

若然的专栏 3913

SudaMod-81.0 / crDroidAndroid-8.1(android-8.1.0_r20)红米3 2018年5月3日更新

一、写在前面   我只是个人爱好,本ROM未集成任何第三方推广软件,我只是喜欢把好的资源分享出来,若可以,我们一起学习,一起进步。   请不要问我怎么刷机!   请不要问我玩游戏卡不卡(有钱你就换好点的手机)! 二、SM81.0简介      sudamod是基于CM二次开发的系统,他们致力于打造纯净的安卓本土化系统。   它的开源地址是:https://github.com/sud...

weixin_30407099的博客 830

(三)8天快速掌握Android视频教程_创建与启动手机模拟器和学习与使用ANDROID操作系统

为了测试安卓工程,我们应该使用安卓模拟器。 创建模拟器,选择安装的Android SDK后Eclipse界面上出现的Android SDK Manager图标。然后选择new按钮,在出现的对话框中,虚拟设备的名称可以随便取,Target那一栏选择Android平台的版本。SD Card用来存储东西,相当于一个外接设备,但是输入的时候最好不要输入太大的内容,选择了容量以后,它会在硬盘上划分一块地方

xiaobao234的专栏 747

Android创意——多功能智能播放器

[color=green][align=center][size=medium][url=http://www.google.com/intl/zh-CN/daxue/blog2010/]首届 Google 暑期大学生博客分享大赛——2010 Android 篇[/url][/color][/size][/align] [size=medium] 在20世纪90年代,裘伯...

风笛手 386
上一篇: Android默认时区、语言设置
下一篇: MTK拨号盘上面按钮添加各国字母方法
旧时旅人
博客等级 码龄10年 186粉丝 117原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧时旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值