android开发实战 041102-声音服务audiomanag_第1页
android开发实战 041102-声音服务audiomanag_第2页
android开发实战 041102-声音服务audiomanag_第3页
android开发实战 041102-声音服务audiomanag_第4页
android开发实战 041102-声音服务audiomanag_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TRAININGSERIESAndroid开发实战经典041102·声音服务AudioManagerSYSTEMSERVICE·AUDIOARCHITECTURE·PRACTICALGUIDEINTERNALTRAININGVOL.04·CH.11AANDROIDAUDIOCONTENTSTABLEOFCONTENTS课程大纲01AudioManager架构总览与系统定位理解音频服务的核心入口与系统层级关系02音频流类型与音量控制体系StreamType使用场景与版本适配策略03音频焦点管理机制详解多应用共存时的核心协调机制04音频模式与设备路由策略扬声器、听筒、蓝牙设备切换实战05蓝牙音频A2DP/SCO实战两大蓝牙协议的接入与调试要点06MediaSession现代集成方案对齐Android12+最佳实践07性能优化与疑难排查手册高频问题汇总与项目实战解法AUDIOSYSTEMSERVICE7MODULES·32PAGESSYSTEMSERVICEAUDIOFRAMEWORK01Chapter01AudioManager架构总览系统定位分层架构核心职责ARCHITECTUREAUDIOSYSTEMAudioManager系统定位AudioManager是应用层访问音频系统的唯一官方门面,它通过Binder与AudioService通信,自身不直接操作硬件。理解App→AudioManager→AudioFlinger→HAL的分层模型,是排查"API不生效"问题的认知基础。BinderIPC绑定:AudioManager通过Context.getSystemService获取,底层绑定AudioService的Binder代理,所有调用均为跨进程IPC操作双服务分工:AudioFlinger负责音频数据的混音、重采样与输出,AudioPolicyService负责设备选择与路由策略,两者分工明确安全边界约束:应用层无法绕过AudioManager直接操作AudioFlinger,这是Android安全模型的设计约束,也是版本兼容性的保障边界OEM差异风险:不同OEM厂商可能在AudioService层注入定制逻辑,导致同一API在不同设备上表现差异,需做防御性编程App→AudioManager→AudioService→AudioFlinger→HAL→HardwareAANDROIDAUDIOOVERVIEWCORERESPONSIBILITIES四大核心职责域AudioManager的功能版图可归纳为音量控制、音频焦点、音频模式、设备管理四个域,覆盖应用层95%以上的音频需求。每个域都有对应的API族与版本演进历史,后续章节将逐一深入。01音量控制与静音管理提供getStreamVolume/setStreamVolume/adjustStreamVolume三组API,分别对应查询、绝对设置、步进调整三种操作模式Android6.0起setStreamMute被废弃,需改用adjustStreamVolume配合ADJUST_MUTE/ADJUST_UNMUTE方向参数实现静音切换02音频焦点协调机制通过requestAudioFocus/abandonAudioFocus实现多应用间的音频播放权协商,支持永久、瞬态、可Duck三种焦点类型Android8.0引入AudioFocusRequest.Builder模式,Android12起系统强制执行焦点规则,未获焦点的应用可能被静默忽略03音频模式与场景切换MODE_NORMAL/MODE_RINGTONE/MODE_IN_CALL/MODE_IN_COMMUNICATION四种模式决定系统级音频路由策略与硬件通路选择Android12起系统可能主动切换音频模式以响应来电等事件,应用需注册OnModeChangeListener监听而非强行覆盖AANDROIDAUDIOEVOLUTIONTimeline版本演进与适配要点AudioManager的版本演进主线是'权限收紧':从5.0的音量流合并,到6.0废弃直接静音,到12强制焦点前置,到15限制后台焦点请求。每次升级都在缩小应用自主权、扩大系统管控权,适配工作本质上是顺应这一趋势。5.0音量流统一合并STREAM_MUSIC为主音量流,平板与手机行为统一,通知与铃声音量改由STREAM_RING控制6.0废弃直接静音API废弃setStreamSolo/setStreamMute,改用requestAudioFocus和adjustStreamVolume+ADJUST_MUTE替代8.0Builder模式焦点请求引入AudioFocusRequest.Builder,支持setWillPauseWhenDucked和setAcceptDelayedFocusGain精细化配置12强制焦点前置setSpeakerphoneOn/setMode在未获焦点时被静默忽略,新增OnModeChangeListener15后台焦点限制请求焦点时应用必须处于前台或运行mediaPlayback/camera/microphone/phoneCall类型前台服务AANDROIDAUDIOSECTIONDIVIDERCHAPTER02音频流与音量控制StreamType音量APIFLAG参数版本适配ANDROIDSOUNDSERVICE02/04AAndroidAudioSTREAMTYPESAudioManager六大音频流类型详解StreamType决定了音量键响应、静音模式行为和焦点优先级三大核心属性。STREAM_MUSIC是媒体播放的默认安全选择;误用VOICE_CALL会导致音量不可控;RING/ALARM/NOTIFICATION在非对应场景使用会破坏用户体验预期。通话与系统音频流

STREAM_VOICE_CALL专用于电话通话语音,音量范围独立且受运营商策略约束,非通话场景误用会导致媒体音量不可调

STREAM_SYSTEM用于系统级提示音(如按键音、锁屏音),部分OEM会将其静音或重定向,不应作为业务音频的输出通道媒体与通知音频流

STREAM_MUSIC是音乐、视频、游戏等媒体内容的标准选择,音量范围最大且不受铃声模式影响,兼容性最佳

STREAM_NOTIFICATION用于消息提醒等短暂提示音,Android5.0后与STREAM_RING联动,单独调节能力受限需注意适配铃声与闹钟音频流

STREAM_RING专用于来电铃声,在静音模式下会被系统抑制,不应复用于非铃声场景以免被意外静音

STREAM_ALARM用于闹钟和定时器,设计上要求在静音模式下仍可播放,是定时提醒类功能的唯一正确选择最佳实践:绝大多数媒体播放场景应使用STREAM_MUSIC,避免在非通话场景使用STREAM_VOICE_CALLAUDIOMANAGER音量控制API对比VOL·API三套音量API各有适用场景:getStreamVolume用于读取,setStreamVolume用于精确设置(如滑块),adjustStreamVolume用于步进调整(如按键)。Android6.0后静音操作必须走adjustStreamVolume+ADJUST_MUTE,废弃的setStreamMute在新版本上可能失效。01getStreamVolume—读取当前音量返回当前音量整数值,范围0~getStreamMaxVolume。注意返回值因设备而异,不可硬编码上限值。02setStreamVolume—绝对音量设置直接设定绝对音量值,第三个参数传入FLAG_SHOW_UI可触发系统音量面板,适合滑块控件等用户主动调节场景。03adjustStreamVolume—步进式调整按步长递增/递减/静音,支持RAISE/LOWER/SAME/MUTE/UNMUTE五种方向,适合程序化静默调整与物理按键映射。04FLAG参数组合策略FLAG_ALLOW_RINGER_MODES允许联动铃声模式切换,FLAG_VIBRATE在静音模式下触发震动反馈,按业务需求灵活组合。05setStreamMute废弃迁移Android6.0起setStreamMute正式废弃,继续使用不报错但行为不确定必须迁移,应使用adjustStreamVolume+ADJUST_MUTE方案替代。AAudioManagerPITFALLSWarning音量控制高频踩坑点音量控制的三大陷阱:StreamType错配导致音量键失效、硬编码最大值导致跨设备异常、静音模式下音量设置被系统拦截。规避方法是始终动态获取MaxVolume、正确匹配StreamType、在调整前检查并处理RingerMode状态。StreamType错配陷阱在非通话场景使用STREAM_VOICE_CALL会导致物理音量键无响应,因为通话音量仅在通话UI激活时才绑定硬件按键STREAM_SYSTEM在部分OEM设备上被强制静音或重定向到其他流,不应作为业务音频输出通道以免出现无声问题最大值硬编码风险不同设备的getStreamMaxVolume返回值差异显著(媒体音量范围15~30不等),硬编码上限会导致滑块比例失调或越界崩溃正确做法是运行时动态获取最大值并据此计算百分比映射,SeekBar的max属性应在onCreate中根据实际设备值设定静音模式连锁反应RINGER_MODE_SILENT下对STREAM_RING的音量设置可能被系统拦截或重置,恢复音量前需先切换回NORMAL模式setStreamVolume调用是异步的,立即get可能返回旧值,应监听VOLUME_CHANGED_ACTION广播确认生效ANDROIDAUDIO·VOLUMECONTROLPITFALLS&BESTPRACTICESCHAPTER03音频焦点管理机制焦点类型●回调处理●Builder模式●强制策略AUDIOFOCUSMANAGEMENTANDROIDAUDIOSERVICEAUDIOFOCUSANDROIDAUDIOSERVICE三种焦点类型与回调语义焦点请求类型决定了你对音频权的期望时长和对前持有者的影响:GAIN要求独占且前持有者停止,TRANSIENT要求短暂独占且前持有者暂停,MAY_DUCK允许共存但前持有者降音量。请求类型:独占vs共享GAIN长时独占适用于音乐/视频等长时媒体播放,请求成功后前持有者收到LOSS回调应停止播放并释放资源TRANSIENT短时独占适用于导航语音/提示音等短时场景,前持有者收到LOSS_TRANSIENT应暂停而非停止MAY_DUCK共享降音量适用于消息提醒等可与背景音共存的场景,前持有者收到CAN_DUCK应降低音量继续播放回调处理:恢复策略映射AUDIOFOCUS_GAIN重新获得焦点,应恢复之前保存的播放位置和音量状态,重启媒体播放AUDIOFOCUS_LOSS永久失去焦点,应立即停止播放、释放MediaPlayer/AudioTrack资源并放弃焦点引用AUDIOFOCUS_LOSS_TRANSIENT暂时失去,应暂停播放但不释放资源,等待后续GAIN回调恢复LOSS_TRANSIENT_CAN_DUCK需降低音量至原音量的20%-30%,收到GAIN后恢复原始音量请求独占请求暂占共享共存恢复终止暂停降音量AUDIOFOCUSTYPES&CALLBACKSAANDROIDAUDIOBUILDERPATTERNAUDIOFOCUSAudioFocusRequest.Builder现代用法Builder模式增加了AudioAttributes声明、自动Duck暂停、异步焦点获取三大能力。新旧API不可混用。01setAudioAttributes—声明USAGE和CONTENT_TYPE,系统据此决定路由策略和焦点优先级02setWillPauseWhenDucked(true)—让系统在收到MAY_DUCK请求时自动暂停你的播放03setAcceptDelayedFocusGain(true)—启用异步焦点获取,高优先级应用占用时请求排队而非失败04setOnAudioFocusChangeListener—注册焦点变化回调,必须在主线程Handler上执行05abandonAudioFocusRequest(request)—新API配套的释放方法,不可与旧版abandonAudioFocus混用AANDROIDAUDIOAUDIOFOCUSPolicyShiftAndroid12+强制焦点策略Android12将音频焦点从君子协定升级为系统法规:未获焦点的应用调用setSpeakerphoneOn/setMode会被静默忽略。01AUDIOFOCUS_REQUEST_GRANTEDsetSpeakerphoneOn(true)setSpeakerphoneOn静默失效:未获AUDIOFOCUS_REQUEST_GRANTED前调用setSpeakerphoneOn(true)会被系统静默忽略,这是Android12+最常见的扬声器不生效根因。02MODE_NORMALMODE_IN_CALLaddOnModeChangeListener系统主动切换模式:系统可能因来电等事件主动将MODE_NORMAL切换为MODE_IN_CALL,应用需注册addOnModeChangeListener感知变化。03requestAudioFocusFAILED焦点请求前置校验:requestAudioFocus必须在播放音频之前调用并检查返回值,返回FAILED时应向用户提示而非静默继续。04requestAudioFocusFAILEDAndroid15进一步收紧:后台应用或非音频前台服务调用requestAudioFocus将直接返回FAILED,彻底封堵后台抢占焦点的可能。ANDROIDAUDIOSERVICE·CLASSICCASES14CHAPTER04音频模式与设备路由四种模式·路由策略·设备切换·状态监听AUDIOMANAGER·DEEPDIVESECTION04AANDROIDAUDIOTRAININGAUDIOMODESSEMANTICS四种音频模式语义辨析MODE_IN_CALL专属于传统电话通话;VoIP应用必须使用MODE_IN_COMMUNICATION以获得回声消除和自主路由能力。SECTION01常规与铃声模式MODE_NORMAL默认模式,媒体播放、游戏、TTS等场景均应保持此模式MODE_RINGTONE由系统在来电时自动激活,仅STREAM_RING音频从所有可用设备输出SECTION02通话与通信模式MODE_IN_CALL专用于传统电话通话,由Telecom框架独占管理,VoIP应用误用会触发HFP协议切换MODE_IN_COMMUNICATIONVoIP/视频通话的正确选择,启用回声消除和降噪链路易混淆点:MODE_IN_CALL≠VoIP通话。MODE_IN_CALL由系统Telecom框架独占,第三方应用应始终使用MODE_IN_COMMUNICATION。AANDROIDAUDIOROUTINGLOGICAudioPolicyService设备路由决策逻辑路由决策权在AudioPolicyService,应用只能施加影响不能强制控制。优先级受音频模式制约。DEFAULTROUTINGPRIORITY1蓝牙HFP▸2USB音频▸3有线耳机▸4蓝牙A2DP▸5扬声器▸6听筒01MODE_IN_COMMUNICATION通话模式设备筛选—MODE_IN_COMMUNICATION下系统优先选择支持双向语音的设备,A2DP因无麦克风通道被自动排除02setSpeakerphoneOn(true)扬声器强制输出—setSpeakerphoneOn(true)可强制走扬声器,但Android12+必须先获得音频焦点否则被静默忽略03ACTION_AUDIO_BECOMING_NOISY噪声广播响应—ACTION_AUDIO_BECOMING_NOISY广播在耳机拔出时触发,媒体应用应在此回调中暂停播放04registerAudioDeviceCallback热插拔重路由—设备热插拔触发AudioPolicyService重新计算路由,应用可通过registerAudioDeviceCallback监听AAUDIOMANAGERWORKFLOWPRACTICE扬声器切换四步标准流程Android12+下setSpeakerphoneOn必须先获焦点再生效。标准流程:请求焦点→设MODE_IN_COMMUNICATION→开扬声器→验证状态。01请求音频焦点AudioFocusRequest.Builder(USAGE_VOICE_COMMUNICATION)AUDIOFOCUS_GAIN_TRANSIENT用AudioFocusRequest.Builder(USAGE_VOICE_COMMUNICATION)请求AUDIOFOCUS_GAIN_TRANSIENT,确认返回GRANTED02设置通信模式setMode(MODE_IN_COMMUNICATION)setMode(MODE_IN_COMMUNICATION)启用语音处理链路,此步骤在Android12+同样依赖焦点03开启扬声器并验证setSpeakerphoneOn(true)isSpeakerphoneOn()setSpeakerphoneOn(true)请求切换到扬声器,调用后立即用isSpeakerphoneOn()验证状态04退出时反序清理setSpeakerphoneOn(false)setMode(MODE_NORMAL)abandonAudioFocusRequestsetSpeakerphoneOn(false)→setMode(MODE_NORMAL)→abandonAudioFocusRequest全程在主线程执行,不在onDestroy以外遗留IN_COMMUNICATION状态CHAPTER05蓝牙音频实战A2DP音乐·SCO通话·协议切换·状态监听AAndroidAudioTrainingBLUETOOTHPROTOCOLDEEPDIVEA2DP协议原理与连接流程A2DP是单向高质量音频传输协议,连接需经SDP发现→能力交换→编码协商→数据通道建立四步。不支持麦克风。1连接四步:SDP服务发现→AVDTP_DISCOVER枚举能力→GET_CAPABILITIES获取编码支持→SET_CONFIGURATION协商最优编码2编码协商自动选择双方都支持的最高质量格式,优先级通常为LDAC>aptXHD>aptX>AAC>SBC3单向协议:A2DP仅支持播放,当需要麦克风输入时系统自动断开A2DP切换到HFP/SCO4状态查询:通过BluetoothA2dp.getConnectionState()查询,注册ACTION_CONNECTION_STATE_CHANGED广播监听5互斥限制:A2DP与SCO不能同时活跃,切换有数百毫秒延迟,VoIP应用接听时应预建SCO通道A2DPProtocolStackCodecPriorityLDACaptXHDaptXAACSBCA2DP与SCO互斥,切换延迟数百毫秒,VoIP需预建通道BLUETOOTHAUDIOSERVICESCO通道建立与状态管理startBluetoothSco是异步请求,必须监听ACTION_SCO_AUDIO_STATE_UPDATED广播等待CONNECTED状态后才能使用。正确做法是状态驱动。SCO建立流程与前置条件异步请求机制:startBluetoothSco()仅发起异步请求,需注册ACTION_SCO_AUDIO_STATE_UPDATED广播监听状态,CONNECTED后才可启动AudioRecord/AudioTrack前置条件:蓝牙耳机已配对且支持HFP协议、已声明BLUETOOTH_CONNECT(Android12+)和MODIFY_AUDIO_SETTINGS权限startBluetoothSco()BroadcastCONNECTEDAudioStart状态驱动的正确实践状态响应策略:收到SCO_AUDIO_STATE_CONNECTED后启动通话音频流,收到DISCONNECTED后自动降级到手机听筒/扬声器并通知用户资源释放顺序:通话结束时先stopBluetoothSco()再abandonAudioFocus,避免SCO通道残留CONNECTED→启动音频流DISCONNECTED→降级听筒/扬声器TEARDOWN→stopSco→abandonFocusAANDROIDAUDIOTRAININGBLUETOOTHPROTOCOLA2DP/SCO协议切换处理A2DP与SCO不能共存是蓝牙协议硬约束,切换时有500ms-2s音频中断。应用应预建SCO缩短延迟、在断开广播中暂停并记录位置。01协议互斥与状态反馈—A2DP与SCO互斥是协议层硬约束,切换时音频中断500ms-2s属正常现象,应用应在UI上给予用户明确的状态反馈02预建SCO通道—检测到HFP设备连接时可预建SCO通道,将切换延迟从2s缩短至500ms以内03断连广播与自动恢复—监听A2DP断开广播时暂停播放并保存进度,SCO断开后自动触发A2DP重连并恢复播放04通道活跃度验证—播放前用BluetoothA2dp.isA2dpPlaying()验证通道活跃度,仅检查getConnectionState可能遇到假连接05AudioDeviceCallback优先—Android12+可通过AudioDeviceCallback.onAudioDevicesChanged监听设备变化,比传统广播更可靠Chapter06MediaSession集成方案焦点绑定·通知栏控制·跨设备遥控·最佳实践ARCHITECTUREMEDIASESSIONMediaSession核心架构MediaSession建立了标准化的媒体会话抽象:播放器是服务端,UI/通知栏/外部设备是客户端。它统一管理元数据广播、播放状态同步、焦点联动和跨设备遥控。服务端与客户端角色MediaBrowserService作为服务端承载播放器和MediaSession,通过setMetadata/setPlaybackState向外广播内容和状态变化MediaController作为客户端发送TransportControls指令,同时监听状态回调更新UI,支持多客户端并发连接Server↔Client焦点联动与状态同步MediaSession可配置为获得焦点时自动激活、失去焦点时自动暂停,省去手动处理OnAudioFocusChangeListener的样板代码配合MediaStyle通知自动将播放状态同步到通知栏和锁屏,外部设备通过系统媒体路由自动接收控制指令Focus&SyncINTEGRATIONAUDIOSERVICEAudioManager+MediaSession集成模式标准集成五步:初始化播放器与Session→绑定AudioFocusRequest→实现Callback指令处理→创建MediaStyle前台通知→按序释放资源。1初始化—Service.onCreate中初始化ExoPlayer和MediaSessionCompat,Session的Callback实现onPlay/onPause/onStop映射到播放器对应方法2焦点绑定—通过MediaSession.setAudioFocusRequest绑定焦点请求,焦点变化自动触发Session暂停/恢复3状态同步—每次播放状态变化后调用setPlaybackState更新Session状态,STATE_PLAYING/PAUSED/STOPPED必须与实际播放器状态严格一致4前台通知—用NotificationCompat.MediaStyle(sessionToken)创建前台通知,通知栏控件自动与Session联动5按序释放—onDestroy按序释放:stopForeground→mediaSession.release→player.release,逆序释放避免Session回调触发已释放的播放器ADAPTATIONAndroid12+MediaSession适配要点12+下MediaSession成为音频行为的唯一声明入口:后台播放需声明foregroundServiceType、焦点请求须携带正确Attributes、通知栏控件默认折叠。后台播放声明:必须在Manifest声明foregroundServiceType='mediaPlayback',否则Service在数分钟内被系统终止焦点请求匹配:AudioAttributes必须与播放内容匹配——USAGE_MEDIA用于音乐视频、USAGE_VOICE_COMMUNICATION用于通话通知栏折叠适配:MediaStyle通知在12+默认折叠,暂停/播放等关键操作应设为setShowActionsInCompactView确保折叠状态下可见API版本选择:MediaSession2提供更现代的ListenableFuture异步API,但生产环境仍以MediaSessionCompat为主流统一协调原则:所有播放/暂停/焦点操作应经MediaSession统一协调,绕过Session直接调AudioManager会导致通知栏状态与实际播放不一致CHAPTER07性能优化与疑难排查延迟优化优先级倒置内存泄漏OEM兼容AAUDIOSERVICE07AANDROIDAUDIOLATENCYOPTIMIZATION音频延迟来源与优化延迟由应用缓冲+AudioFlinger混音+HAL输出三层构成,应用可控的是bufferSize。取2-4倍getMinBufferSize平衡延迟与稳定性。缓冲区调优策略bufferSizeInBytes决定延迟下限AudioTrack/AudioRecord的bufferSizeInBytes直接决定应用侧延迟下限,公式为bufferSize/(sampleRate×channels×bytesPerSample)getMinBufferSize取值策略getMinBufferSize返回理论最小值,实际取2–4倍minBuffer平衡延迟与欠载风险低延迟路径与诊断AAudio/OpenSLESFAST路径AAudio低延迟模式和OpenSLESFAST路径绕过AudioFlinger常规混音线程,直连快速混合器,延迟可从100ms降至10ms级别延迟诊断工具链通过adbshelldumpsysaudio查看各Track的bufferSize和latencyMs;AudioTrack.getTimestamp对比写入帧与播放帧时间差量化实际延迟AANDROIDAUDIOSTRATEGYPriorityInversion优先级倒置防范策略优先级倒置是高优先级音频线程被低优先级线程阻塞导致的卡顿/爆音。防范核心是非阻塞数据传递、原子操作替代锁、回调线程零阻塞。01问题表现与根因:优先级倒置表现为音频卡顿、爆音或命令延迟,根因是高优先级线程等待低优先级线程释放共享资源02框架层实现:AudioFlinger内部用非阻塞单读单写FIFO队列传递数据、原子操作更新状态,避免快速混合器线程被普通线程阻塞03应用层铁律:AudioTrack/AudioRecord回调线程中禁止I/O、网络、数据库、synchronized等任何可能阻塞的操作04职责分离:回调线程只做纯内存数据拷贝,编解码/特效/网络收发等耗时操作放到独立工作线程05状态共享兜底:若仍需共享状态,将状态大小限制为单次原子操作可处理的字大小,或使用StateQueue等非阻塞状态传递机制AANDROIDAUDIODEBUGGINGLEAKANALYSIS音频资源内存泄漏排查AudioManager泄漏三大源头:焦点Listener未abandon、设备Callback未unregister、MediaSession未release。排查用LeakCanary定位引用链。三大泄漏源头与修复AudioFocus泄漏OnAudioFocusChangeListener注册后未在onDestroy中abandonAudioFocus,AudioService持有Activity引用导致泄漏DeviceCallback泄漏AudioDeviceCallback注册后未unregisterAudioDeviceCallback,系统服务持续回调已销毁对象MediaSession泄漏MediaSession.release()未调用导致Binder连接和通知管理器引用残留排查工具与防御编程LeakCanary定位捕获泄漏堆栈定位AudioService/AudioManager内部引用链,反向追踪到未配对的register/request/new调用点统一Clea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论