Android VibratorService

本文详细介绍了Android系统的VibratorService,包括如何检查权限、启动振动以及处理重复振动。在使用VibratorService时,应用需要在AndroidManifest.xml中声明android.permission.VIBRATE权限,并在适当的时候调用startVibrationLocked()和doVibratorOn()方法来控制振动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//振动一次
public void vibrate(int uid, String opPkg, long milliseconds, int usageHint,
IBinder token) {
//检测调用者APP是否有android.Manifest.permission.VIBRATE这个权限,所以APP要使用震动服务,需要在AndroidManifest.xml中声明权限
//android.Manifest.permission.VIBRATE的值android.permission.VIBRATE权限,权限保护等级为normal,即安装时授权。
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Requires VIBRATE permission");
}
verifyIncomingUid(uid);
if (milliseconds <= 0 || (mCurrentVibration != null
&& mCurrentVibration.hasLongerTimeout(milliseconds))) {
return;
}


if (DEBUG) {
Slog.d(TAG, "Vibrating for " + milliseconds + " ms.");
}
//将振动封装成一个振动的对象
Vibration vib = new Vibration(token, milliseconds, usageHint, uid, opPkg);


final long ident = Binder.clearCallingIdentity();
try {
synchronized (mVibrations) {
...
//传输Vibration对象
startVibrationLocked(vib);
}
} finally {
Binder.restoreCallingIdentity(ident);
}
}


private void startVibrationLocked(final Vibration vib) {
try {
if (mLowPowerMode
&& vib.mUsageHint != AudioAttributes.USAGE_NOTIFICATION_RINGTONE) {
return;
}
int mode = mAppOpsService.checkAudioOperation(AppOpsManager.OP_VIBRATE,
vib.mUsageHint, vib.mUid, vib.mOpPkg);
if (mode == AppOpsManager.MODE_ALLOWED) {
mode = mAppOpsService.startOperation(AppOpsManager.getToken(mAppOpsService),
AppOpsManager.OP_VIBRATE, vib.mUid, vib.mOpPkg);
}
if (mode != AppOpsManager.MODE_ALLOWED) {
if (mode == AppOpsManager.MODE_ERRORED) {
Slog.w(TAG, "Would be an error: vibrate from uid " + vib.mUid);
}
mH.post(mVibrationRunnable);
return;
}
} catch (RemoteException e) {
}
//当是重复震动时mTime指振动的时间,mTime等于0时表示重复振动
if (vib.mTimeout != 0) {
//启动振动
doVibratorOn(vib.mTimeout, vib.mUid, vib.mUsageHint);
mH.postDelayed(mVibrationRunnable, vib.mTimeout);
} else {
//通过线程重复振动
mThread = new VibrateThread(vib);
mThread.start();
}
}




private void doVibratorOn(long millis, int uid, int usageHint) {
synchronized (mInputDeviceVibrators) {
if (DEBUG) {
Slog.d(TAG, "Turning vibrator on for " + millis + " ms.");
}
try {
mBatteryStatsService.noteVibratorOn(uid, millis);
mCurVibUid = uid;
} catch (RemoteException e) {
}
final int vibratorCount = mInputDeviceVibrators.size();
//若有多个振动器
if (vibratorCount != 0) {
final AudioAttributes attributes = new AudioAttributes.Builder().setUsage(usageHint)
.build();
for (int i = 0; i < vibratorCount; i++) {
mInputDeviceVibrators.get(i).vibrate(millis, attributes);
}
} else {
//是一个native方法,通过JNI调用到com_android_server_VibratorService.cpp中的
//vibratorOn函数
vibratorOn(millis);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值