请逐行分析下Android T 的AudioService.java中setMode函数
时间: 2023-06-13 15:04:56 浏览: 243
Android使用Service播放音乐
4星 · 用户满意度95%
好的,让我来逐行分析下Android T的AudioService.java中setMode函数。
```java
/**
* @see AudioManager#setMode(int)
*/
public void setMode(int mode, IBinder cb, String callingPackageName) {
enforceModifyAudioRoutingPermission();
synchronized (mConnectedDevices) {
final int newModeOwnerPid = Binder.getCallingPid();
final int newModeOwnerUid = Binder.getCallingUid();
final long ident = Binder.clearCallingIdentity();
final boolean modeOwnerChanged = (mModeOwnerPid != newModeOwnerPid
|| mModeOwnerUid != newModeOwnerUid);
try {
setModeInt(mode, cb, callingPackageName, modeOwnerChanged, newModeOwnerPid,
newModeOwnerUid);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
```
这个函数的作用是设置音频模式,它是实现了AudioManager类的setMode方法。
函数的第一个参数mode是要设置的音频模式。
函数的第二个参数cb是一个Binder对象,它可以在AudioFocusManager中使用,用来管理音频焦点。
函数的第三个参数callingPackageName是调用这个函数的应用程序的包名。
接下来是函数的实现。
首先,它调用enforceModifyAudioRoutingPermission()方法来检查是否有修改音频路由的权限。
然后,它使用synchronized关键字同步了mConnectedDevices,这是一个存储连接的设备信息的集合。
接着,它获取了调用这个函数的应用程序的PID和UID,以及清除了调用者的身份验证标识符。
接下来,它检查是否有新的模式所有者,并设置了一个用于检测模式所有者更改的标志。
最后,它调用了setModeInt方法来实际设置音频模式,传递了所有必要的参数,并在结束时恢复了调用者的身份验证标识符。
至此,Android T的AudioService.java中setMode函数的分析就结束了。
阅读全文