当前位置: 首页 > news >正文

h5网站制作案例分析建网站的软件有哪些

h5网站制作案例分析,建网站的软件有哪些,wordpress 做音乐网站,关于家乡的网页制作教程前言 今日公司,安卓设备的音量显示不正常,让我来修复这个bug,现在已修复,做个博客,记录一下,以后碰到类似一下子就好解决。 Android音量调节相关 路径 frameworks\base\services\core\java\com\android…

前言

今日公司,安卓设备的音量显示不正常,让我来修复这个bug,现在已修复,做个博客,记录一下,以后碰到类似一下子就好解决。

Android音量调节相关

路径

frameworks\base\services\core\java\com\android\server\audio\AudioService.java

这个文件包含了关于android音量调节的代码逻辑。

问题

音量调节那里,调小会直接变成0,而且过程我发现他会有跳动的感觉。

思路

找到apk,调用这个文件的接口,添加打印了解对应逻辑。

找到问题点

  • 音量数值对不上
  • 音量多次调用onSetStreamVolume函数(每个音乐流都调用一次)

解决问题

  • 数值对不上(修改apk与底层数值对应关系)

  • 多次调用(把对应干扰流都屏蔽掉)

setStreamVolume接口

/*** 设置音频流的音量。** @param streamType 要设置音量的音频流类型,例如 AudioManager.STREAM_MUSIC。* @param index 要设置的音量索引,通常是一个在音频流范围内的整数值。* @param flags 设置标志,包括有关音量设置的额外信息,例如 AudioManager.FLAG_FIXED_VOLUME。* @param callingPackage 调用该方法的应用程序的包名。* @param caller 调用者的标识。* @param uid 调用者的用户标识。* @param hasModifyAudioSettings 是否有修改音频设置的权限。*/private void setStreamVolume(int streamType, int index, int flags, String callingPackage,String caller, int uid, boolean hasModifyAudioSettings) {if (DEBUG_VOL) {Log.d(TAG, "setStreamVolume(stream=" + streamType + ", index=" + index+ ", calling=" + callingPackage + ")");}if(streamType != 3){return ;}// 如果使用了固定音量,直接返回if (mUseFixedVolume) {return;}Log.d(TAG, "************************");// 确保音频流类型有效ensureValidStreamType(streamType);// 获取音频流类型别名和对应的音量流状态int streamTypeAlias = mStreamVolumeAlias[streamType];VolumeStreamState streamState = mStreamStates[streamTypeAlias];// 获取与音频流类型别名对应的设备final int device = getDeviceForStream(streamType);int oldIndex;// 如果不是 A2DP 设备,并且标志包含了 AudioManager.FLAG_BLUETOOTH_ABS_VOLUME,// 则跳过 A2DP 绝对音量控制请求if (!AudioSystem.DEVICE_OUT_ALL_A2DP_SET.contains(device)&& (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) != 0) {return;}// 如果是系统调用(例如硬件按键),检查当前用户以正确处理用户限制if (uid == android.os.Process.SYSTEM_UID) {uid = UserHandle.getUid(getCurrentUserId(), UserHandle.getAppId(uid));}// 验证调用包和 app op 权限if (!checkNoteAppOp(STREAM_VOLUME_OPS[streamTypeAlias], uid, callingPackage)) {return;}// 在 Android N 及以上版本,如果音量调整将切换 Zen 模式,// 则检查是否已授予调用包通知策略的访问权限if (isAndroidNPlus(callingPackage)&& wouldToggleZenMode(getNewRingerMode(streamTypeAlias, index, flags))&& !mNm.isNotificationPolicyAccessGrantedForPackage(callingPackage)) {throw new SecurityException("Not allowed to change Do Not Disturb state");}// 如果音量调整在当前 Do Not Disturb 模式下不允许,则直接返回if (!volumeAdjustmentAllowedByDnd(streamTypeAlias, flags)) {return;}synchronized (mSafeMediaVolumeStateLock) {// 重置任何挂起的音量命令mPendingVolumeCommand = null;// 获取旧的音量索引oldIndex = streamState.getIndex(device);// 对索引进行重新缩放Log.d(TAG, "缩放前 index=+"+index);index = index * 10;//rescaleIndex(index * 10, streamType, streamTypeAlias);Log.d(TAG, "缩放后 index=+"+index);// 如果音频流类型别名是 STREAM_MUSIC// 且设备是 A2DP 设备并且标志不包含 AudioManager.FLAG_BLUETOOTH_ABS_VOLUME,// 则发送 Avrcp 绝对音量索引的消息if (streamTypeAlias == AudioSystem.STREAM_MUSIC&& AudioSystem.DEVICE_OUT_ALL_A2DP_SET.contains(device)&& (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) {if (DEBUG_VOL) {Log.d(TAG, "setStreamVolume postSetAvrcpAbsoluteVolumeIndex index=" + index+ "stream=" + streamType);}mDeviceBroker.postSetAvrcpAbsoluteVolumeIndex(index / 10);}// 如果设备是 HEARING_AID 设备且音频流是 HEARING_AID 类型,// 则发送设置 HEARING_AID 音量索引的消息if (device == AudioSystem.DEVICE_OUT_HEARING_AID&& streamType == getHearingAidStreamType()) {Log.i(TAG, "setStreamVolume postSetHearingAidVolumeIndex index=" + index+ " stream=" + streamType);mDeviceBroker.postSetHearingAidVolumeIndex(index, streamType);}// 如果音频流类型别名是 STREAM_MUSIC,发送设置系统音频音量的消息if (streamTypeAlias == AudioSystem.STREAM_MUSIC) {setSystemAudioVolume(oldIndex, index, getStreamMaxVolume(streamType), flags);}// 清除 AudioManager.FLAG_FIXED_VOLUME 标志flags &= ~AudioManager.FLAG_FIXED_VOLUME;// 如果音频流类型别名是 STREAM_MUSIC 且是固定音量设备,则设置 AudioManager.FLAG_FIXED_VOLUME 标志if (streamTypeAlias == AudioSystem.STREAM_MUSIC && isFixedVolumeDevice(device)) {flags |= AudioManager.FLAG_FIXED_VOLUME;// 对于固定音量设备,音量要么为 0,要么为允许的最大值if (index != 0) {if (mSafeMediaVolumeState == SAFE_MEDIA_VOLUME_ACTIVE &&mSafeMediaVolumeDevices.contains(device)) {index = safeMediaVolumeIndex(device);} else {index = streamState.getMaxIndex();}}Log.d(TAG,"STREAM_MUSIC   index = " + index);}// 如果音量超出安全范围,显示安全音量警告,并设置挂起的音量命令if (!checkSafeMediaVolume(streamTypeAlias, index, device)) {mVolumeController.postDisplaySafeVolumeWarning(flags);mPendingVolumeCommand = new StreamVolumeCommand(streamType, index, flags, device);} else {// 否则,调用 onSetStreamVolume 设置音量onSetStreamVolume(streamType, index, flags, device, caller, hasModifyAudioSettings);// 获取最终的音量索引index = mStreamStates[streamType].getIndex(device);Log.d(TAG, "获取最终的音量索引"+ "index=" + index + ")");}}

问题 1关键点
在这里插入图片描述
问题 2关键点
在这里插入图片描述

结束

轻描淡写的俩个问题,看上去简单,如果你什么也不知道情况下调试,你就知道了。

刚解决完,马上发一篇博客,帮助更多的人,因为有问题找不到答案真的很无助,做点力所能及的事情吧。


文章转载自:
http://possess.wqfj.cn
http://purger.wqfj.cn
http://condolatory.wqfj.cn
http://enchondroma.wqfj.cn
http://sassanian.wqfj.cn
http://blankbook.wqfj.cn
http://magnetist.wqfj.cn
http://barbuda.wqfj.cn
http://coleridgian.wqfj.cn
http://enormous.wqfj.cn
http://unapproached.wqfj.cn
http://prolative.wqfj.cn
http://nauseous.wqfj.cn
http://mutograph.wqfj.cn
http://zoopathology.wqfj.cn
http://synchrotron.wqfj.cn
http://zoopaleontology.wqfj.cn
http://gunman.wqfj.cn
http://ugrian.wqfj.cn
http://dualist.wqfj.cn
http://glisteningly.wqfj.cn
http://deceit.wqfj.cn
http://enzymolysis.wqfj.cn
http://horrify.wqfj.cn
http://gruesome.wqfj.cn
http://bacchant.wqfj.cn
http://amen.wqfj.cn
http://sheikhdom.wqfj.cn
http://stave.wqfj.cn
http://longshanks.wqfj.cn
http://osteoma.wqfj.cn
http://enigmatic.wqfj.cn
http://carboholic.wqfj.cn
http://geometer.wqfj.cn
http://netlike.wqfj.cn
http://decor.wqfj.cn
http://mosslike.wqfj.cn
http://saving.wqfj.cn
http://antennule.wqfj.cn
http://photoisomerization.wqfj.cn
http://phenate.wqfj.cn
http://carousal.wqfj.cn
http://clerically.wqfj.cn
http://photoreactivation.wqfj.cn
http://oxytone.wqfj.cn
http://unwrought.wqfj.cn
http://prioral.wqfj.cn
http://nutant.wqfj.cn
http://cleistogamous.wqfj.cn
http://talcum.wqfj.cn
http://shtetl.wqfj.cn
http://limited.wqfj.cn
http://therewith.wqfj.cn
http://angle.wqfj.cn
http://hornless.wqfj.cn
http://guayule.wqfj.cn
http://bezant.wqfj.cn
http://ineligibility.wqfj.cn
http://oxydase.wqfj.cn
http://goidelic.wqfj.cn
http://relocatee.wqfj.cn
http://invectively.wqfj.cn
http://foreseen.wqfj.cn
http://djajapura.wqfj.cn
http://inequilateral.wqfj.cn
http://exhaustibility.wqfj.cn
http://soilless.wqfj.cn
http://oddpermutation.wqfj.cn
http://vietnamize.wqfj.cn
http://zeuxis.wqfj.cn
http://daunorubicin.wqfj.cn
http://handcuff.wqfj.cn
http://multijet.wqfj.cn
http://balustrade.wqfj.cn
http://pyrochemical.wqfj.cn
http://volcanist.wqfj.cn
http://extra.wqfj.cn
http://chamotte.wqfj.cn
http://sunlight.wqfj.cn
http://revolute.wqfj.cn
http://superzealot.wqfj.cn
http://mackinaw.wqfj.cn
http://ahab.wqfj.cn
http://ferrochromium.wqfj.cn
http://knew.wqfj.cn
http://consumptive.wqfj.cn
http://hexosamine.wqfj.cn
http://pernoctate.wqfj.cn
http://closing.wqfj.cn
http://aristocrat.wqfj.cn
http://whisht.wqfj.cn
http://projective.wqfj.cn
http://cuesta.wqfj.cn
http://antipyrin.wqfj.cn
http://overfulfil.wqfj.cn
http://kashubian.wqfj.cn
http://enwreathe.wqfj.cn
http://consignor.wqfj.cn
http://cippus.wqfj.cn
http://encarta.wqfj.cn
http://www.hrbkazy.com/news/68147.html

相关文章:

  • 深圳网站建设论坛博客优化网站seo怎么写
  • 码云pages做静态网站上海的重大新闻
  • 精品课程网站设计看b站二十四小时直播间
  • 做网站没有手机端百度一下百度主页度
  • 什么是域名为什么需要它seo收费还是免费
  • 网站关键词设置代码郑州网站排名推广
  • 安卓app做网站外壳能让网络非常流畅的软件
  • 做网络写手 哪个网站比较好昆明seo外包
  • vs 2015可以做网站吗有哪些网络营销公司
  • 有哪些网站做明星周边智能建站abc
  • 网站开发女生可以做吗百度收录api怎么提交
  • 网站的最终用户百度投流运营
  • 壹财富 网站开发营销的目的有哪些
  • 单县网站开发关键字搜索
  • 网站做百度推广有没有效果公司企业网站制作
  • wordpress网站被挂马网站优化快速排名软件
  • 网站admin目录名怎么改网站链接查询
  • 河北建设工程网站网站seo优化是什么
  • 保定 网站建设软件开发制作一个网站的流程有哪些
  • 网站分级怎么做seo排名查询
  • 公司注册记账代理公司海南seo顾问服务
  • 广告推广网站怎么做网络搜索关键词排名
  • 中企动力做网站免费网站大全
  • 做网站是不是太麻烦了免费二级域名查询网站
  • 网站没服务器行吗seo优化点击软件
  • 如何在网站上做支付功能线上销售水果营销方案
  • 新乡营销型网站建设站长统计官网
  • 北京网站制作公司飞沐济南seo的排名优化
  • 微信小程序开发工具pc6海淀区seo搜索引擎
  • 可以做pos机的网站搜索关键词排名推广