我已经阅读了很多关于“相似”问题的不同SO帖子,但是到目前为止,没有任何东西可以解决我的问题:
似乎这一特定步骤(mergeDebugResources)可能以数百种不同的方式严重失败,并且 从不 给出了有用的错误消息。充其量它不能告诉您任何信息,而最坏的情况却可以为您提供误导性信息,使您无法正确地尝试调试问题。
我正在为ExoPlayer编写一个小的包装。我的包装器公开了一个自定义视图,该视图具有直接传递到ExoPlayer的PlayerView
的属性。我的自定义视图的attrs.xml
文件如下所示:
<resources>
<declare-styleable name="BFPlayer">
<!-- PlayerView attributes -->
<!-- I wish these were camelCase and not snake_case, but c'est la vie -->
<attr name="use_artwork" format="boolean" />
<attr name="default_artwork" format="reference" />
<attr name="use_controller" format="boolean" />
<attr name="hide_on_touch" format="boolean" />
<attr name="auto_show" format="boolean" />
<attr name="hide_during_ads" format="boolean" />
<attr name="show_buffering" format="enum">
<enum name="never" value="0" />
<enum name="when_playing" value="1" />
<enum name="always" value="2" />
</attr>
<attr name="resize_mode" format="enum">
<enum name="fit" value="0" />
<enum name="fixed_width" value="1" />
<enum name="fixed_height" value="2" />
<enum name="fill" value="3" />
<enum name="zoom" value="4" />
</attr>
<attr name="surface_type" format="enum">
<enum name="none" value="0" />
<enum name="surface_view" value="1" />
<enum name="texture_view" value="2" />
<enum name="spherical_view" value="3" />
</attr>
<attr name="shutter_background_color" format="color" />
<attr name="keep_content_on_player_reset" format="boolean" />
<attr name="player_layout_id" format="reference" />
<attr name="controller_layout_id" format="reference" />
<!-- BFPlayer attributes -->
<!-- snake_case to match ExoPlayer attributes -->
<attr name="video_src" format="string" />
</declare-styleable>
</resources>
尝试构建项目时出现以下错误:
* What went wrong:
Execution failed for task ':app:mergeDebugResources'.
> 1 exception was raised by workers:
com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource compilation failed
/Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: duplicate value for resource 'attr/resize_mode' with config ''.
/Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: resource previously defined here.
/Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: duplicate value for resource 'attr/surface_type' with config ''.
/Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/906c495794baffdd076b02fc420f6298/res/values/values.xml:726:5-730:25: AAPT: error: resource previously defined here.
/Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/1694e02eca6cc0cfe670672c5973bd19/res/values/values.xml:32:5-36:373: AAPT: error: duplicate value for resource 'attr/show_buffering' with config ''.
/Users/stevenbarnett/.gradle/caches/transforms-2/files-2.1/1694e02eca6cc0cfe670672c5973bd19/res/values/values.xml:32:5-36:373: AAPT: error: resource previously defined here.
/Users/stevenbarnett/Source/BluePlayer/AndroidSDK/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml: error: file failed to compile.
请注意,它声明在values.xml
中从第726行第5行到730行第25列中定义的值是“在values.xml
中在~/.gradle
中从第726行第5行到730行第25列中声明的值。看到相同的声明!
我尝试过:
3.4.0
目录3.0.0
降为3.4.0
)3.5.0-beta1
到attrs.xml
)我在Mac OS X上使用(因此与Windows相关的所有问题均无关紧要)
我在使用64位构建工具的64位计算机上
我之前已经成功构建了这个项目以及许多其他项目。直到我尝试创建此enum
文件后,问题才出现。只有PlayerView
属性会引发错误。删除或重命名这些属性可以使项目得以构建,但是这些是ExoPlayer的MappedByteBuffer
所期望的名称,因此我无法更改它们
答案 0 :(得分:0)
我没有一个满意的答案,但是我确实有一个答案。 种类 。
对于enum
值(仅enum
值),由于某种原因,PlayerView的属性与我自己的属性发生冲突。也许是关于Android如何解析attribute.xml文件的一个怪癖?我通过更改名称来解决此问题,然后在PlayerView上使用方法在实例化时设置这些值:
attrs.xml
<resources>
<declare-styleable name="BFPlayer">
<!-- PlayerView attributes -->
<attr name="useArtwork" format="boolean" />
<attr name="defaultArtwork" format="reference" />
<attr name="useController" format="boolean" />
<attr name="hideOnTouch" format="boolean" />
<attr name="autoShow" format="boolean" />
<attr name="hideDuringAds" format="boolean" />
<attr name="showBuffering" format="enum">
<enum name="never" value="0" />
<enum name="when_playing" value="1" />
<enum name="always" value="2" />
</attr>
<attr name="resizeMode" format="enum">
<enum name="fit" value="0" />
<enum name="fixed_width" value="1" />
<enum name="fixed_height" value="2" />
<enum name="fill" value="3" />
<enum name="zoom" value="4" />
</attr>
<attr name="surfaceType" format="enum">
<enum name="none" value="0" />
<enum name="surface_view" value="1" />
<enum name="texture_view" value="2" />
<enum name="spherical_view" value="3" />
</attr>
<attr name="shutterBackgroundColor" format="color" />
<attr name="keepContentOnPlayerReset" format="boolean" />
<attr name="playerLayoutId" format="reference" />
<attr name="controllerLayoutId" format="reference" />
<!-- BFPlayer attributes -->
<attr name="videoSrc" format="string" />
</declare-styleable>
</resources>
BFPlayer.java
this.setUseArtwork(attributes.getBoolean(R.styleable.BFPlayer_useArtwork, true));
this.setDefaultArtwork(attributes.getDrawable(R.styleable.BFPlayer_defaultArtwork));
this.setUseController(attributes.getBoolean(R.styleable.BFPlayer_useController, true));
this.setControllerHideOnTouch(attributes.getBoolean(R.styleable.BFPlayer_hideOnTouch, true));
this.setControllerAutoShow(attributes.getBoolean(R.styleable.BFPlayer_autoShow, true));
this.setControllerHideDuringAds(attributes.getBoolean(R.styleable.BFPlayer_hideDuringAds, true));
this.setShowBuffering(attributes.getBoolean(R.styleable.BFPlayer_showBuffering, true));
this.setResizeMode(attributes.getInt(R.styleable.BFPlayer_resizeMode, AspectRatioFrameLayout.RESIZE_MODE_FIT));
this.setShutterBackgroundColor(attributes.getColor(R.styleable.BFPlayer_shutterBackgroundColor, Color.BLACK));
this.setKeepContentOnPlayerReset(attributes.getBoolean(R.styleable.BFPlayer_keepContentOnPlayerReset, false));
this.setKeepScreenOn(attributes.getBoolean(R.styleable.BFPlayer_keepScreenOn, true));
我的解决方案有两个问题:
attrs.xml
和BFPlayer.java
之间的属性列表,因此,如果ExoPlayer在将来的版本中添加了新属性,我将不得不记住要更新 两个 个文件而不是一个setSurfaceType
方法。这意味着我实际上无法更改默认值。即使处理纯音频内容,默认设置也会创建视频渲染器,这意味着我在播放纯音频内容时会无缘无故浪费CPU周期和电池寿命还是,这是我能想到的最好的。