更新:我更改了标题,以消除表示ExoPlayer与发生的事情有关的迹象,因为我设法完全不使用它来复制它。>
我决定尝试在API级别上隔离此错误:
我获得了运行Android 7.0(Api 24)的较旧的三星平板电脑(Tab S2),并且在那里没有发生错误。
我无法使用API 25在Nexus 6模拟器上重复此问题
我还尝试了运行Android 8.0.0(Api 26)的较新的三星平板电脑(Tab S3),该版本与Samsung S7 Edge手机相同。我遇到了同样的错误。
然后我创建了一个新的运行Api 26(Oreo 8.0.0)的模拟器(Pixel 2 XL),并运行了该软件,并得到了相同的错误。
然后我创建了一个新的运行Api 27(Oreo 8.1)的模拟器(Pixel XL),并运行了该软件,并得到了相同的错误。
尝试在Android 9上进行验证时无奈无奈-在下载捆绑软件时出现错误,Google搜索以找出许多人必须以管理员身份运行才能解决此问题,然后将下载内容复制到SDK位置我使用我的普通登录名,以我的普通登录名重新启动Android,从Studio的每个提示修补了SDK,并使用9定义了模拟器。
有趣的是,在使用Pie的堆栈跟踪中,我得到了一个不同的行号,用于说明TypefaceCompat发生故障的位置-这次是第47行,至少是在相关类的实例化(TypefaceCompatApi28Impl)上。但是然后stacktrace仍然显示Api21Impl引发错误。检查Api28Impl可以看到它扩展了Api26Impl,后者又扩展了Api21Impl。因此,看起来这只是标记未正确报告的问题。 Api21Impl是基类,因此正在得到报告。它仍然不能解释为什么会发生错误,也不能解决该问题。
因此,至少从这项有限的测试中可以看出,Oreo 8.0引入了一些问题,此问题随后也出现在所有SDK中。
该怎么办?
更新:其他一些奇怪的事情-我的Samsung是API 26(8.0.0),但是下面的堆栈跟踪显示Android正在尝试利用TypefaceCompatApi21Impl:
at androidx.core.graphics.TypefaceCompatApi21Impl.<clinit>(TypefaceCompatApi21Impl.java:74)
TypefaceCompatApi21Impl
中的那行代码如下:
try {
fontFamilyClass = Class.forName(FONT_FAMILY_CLASS);
fontFamilyCtor = fontFamilyClass.getConstructor();
error here---> addFontMethod = fontFamilyClass.getMethod(ADD_FONT_WEIGHT_STYLE_METHOD,
String.class, Integer.TYPE, Boolean.TYPE);
奇怪的是,在堆栈跟踪的更深处,我们看到了如何初始化* Impl类:
调用AppCompatTextView.setTypeface()
方法(第576行)
依次导致创建字体:
finalTypeface = TypefaceCompat.create(getContext(), tf, style);
调用静态方法create()时,这又将导致运行静态初始化程序:
public class TypefaceCompat {
private static final TypefaceCompatBaseImpl sTypefaceCompatImpl;
static {
if (Build.VERSION.SDK_INT >= 28) {
sTypefaceCompatImpl = new TypefaceCompatApi28Impl();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
sTypefaceCompatImpl = new TypefaceCompatApi26Impl();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
&& TypefaceCompatApi24Impl.isUsable()) {
sTypefaceCompatImpl = new TypefaceCompatApi24Impl();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
sTypefaceCompatImpl = new TypefaceCompatApi21Impl();
} else {
sTypefaceCompatImpl = new TypefaceCompatBaseImpl();
}
}
堆栈跟踪中的这一行:
at androidx.core.graphics.TypefaceCompat.<clinit>(TypefaceCompat.java:49)
实际上是初始化TypefaceCompatApi26Impl()
的行,这表明应该使用TypefaceCompatApi26Impl
(鉴于我的三星硬件的API级别,这很有意义),但是stacktrace显示了TypefaceCompatApi21Impl()
抛出错误!
那怎么可能?
这里的另一个线索是,静态初始化器只运行一次。由于我仅在启动详细信息布局后才得到此设置(但是在此之前出现的其他布局中也包含TextView组件),因此该布局必须具有某种不同的关联。这是布局中的前几个组件(直到TextView组件的第一个定义):
<?xml version="1.0" encoding="utf-8"?>
<!-- This layout is used by PlaylistDetailFragment -->
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item_listitem_constraint_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Layout related to Playlist 'Header' -->
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.25"
android:orientation="vertical" />
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.80"
android:orientation="vertical" />
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintGuide_percent="0.90"
android:orientation="vertical" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/item_list_content_image"
android:layout_width="0dp"
android:layout_height="0dp"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_marginStart="16dp"
android:layout_marginTop="4dp"
android:background="?android:attr/selectableItemBackground"
android:src="@drawable/playlist"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/guideline1"
app:layout_constraintBottom_toBottomOf="@+id/playlist_detail_description"/>
<TextView
android:id="@+id/playlist_detail_list_content_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="end"
android:text="@string/playlist_title_label"
android:textAppearance="@android:style/TextAppearance.Material.Small"
app:layout_constraintTop_toTopOf="@+id/playlist_detail_title"
app:layout_constraintBottom_toBottomOf="@+id/playlist_detail_title"
app:layout_constraintRight_toRightOf="@+id/playlist_detail_list_content_description"/>
我认为TextView定义中的android:textAppearance="@android:style/TextAppearance.Material.Small"
行可能由于某种原因引起了问题,但是将其删除没有效果-发生相同的错误。
更新2/15/19:再次发生,这次是在同一台三星设备上,以前没有发生过,布局完全不同,根本没有使用ExoPlayer并且实际上只使用库存小部件。在下面的堆栈跟踪中,此行:
at com.reddragon.cloudframe.PlaylistDetailFragment.onCreateView(PlaylistDetailFragment.java:309)
是我放大布局的地方:
final View rootView = inflater.inflate(R.layout.playlist_detail, container, false);
布局包括非常标准的项目(TextView,RecyclerView,Guidelines)等。这是完整的堆栈跟踪:
2019-02-15 06:31:12.287 10895-10895/com.reddragon.cloudframe E/TypefaceCompatApi21Impl: java.lang.NoSuchMethodException
java.lang.NoSuchMethodException: addFontWeightStyle [class java.lang.String, int, boolean]
at java.lang.Class.getMethod(Class.java:2068)
at java.lang.Class.getMethod(Class.java:1690)
at androidx.core.graphics.TypefaceCompatApi21Impl.<clinit>(TypefaceCompatApi21Impl.java:74)
at androidx.core.graphics.TypefaceCompat.<clinit>(TypefaceCompat.java:49)
at androidx.core.graphics.TypefaceCompat.create(TypefaceCompat.java:190)
at androidx.appcompat.widget.AppCompatTextView.setTypeface(AppCompatTextView.java:576)
at androidx.appcompat.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:217)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:103)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:93)
at androidx.appcompat.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:182)
at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1267)
at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1317)
at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:189)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.reddragon.cloudframe.PlaylistDetailFragment.onCreateView(PlaylistDetailFragment.java:309)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2530)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:887)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1233)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1299)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:688)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2069)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1859)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1814)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1691)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:537)
at androidx.fragment.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:170)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
at android.view.View.measure(View.java:23297)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:733)
at com.google.android.material.appbar.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:95)
at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1556)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:803)
at android.view.View.measure(View.java:23297)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6928)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
有什么想法吗?这很奇怪,而且非常令人沮丧!
似乎它在尝试充气的第一个TextView上失败,但是我不知道为什么会发生此错误。我在该应用程序的其他布局中使用了相同的TextView小部件,它们膨胀得很好!
更新2/13/19::在Google搜索类似问题时发现this post。因为它提到了模拟器与物理上的不同行为,所以我在物理设备(Samsung 7 Edge,Android 8.0.0)和voila上测试了我的问题,没问题。
编辑2/16/19 -但现在可以在本文顶部看到评论。我不知道为什么我在2/13上描述的初始测试中没有发生这种情况,但是问题是运行API 26的Samsung 7 Edge出现了“返回”问题。
我删除了以前的模拟器(Nexus 5,API 27),并创建了一个新模拟器(Nexus 6,API 25),并且..没有错误!奇怪,但是我想仿真器有些混乱了……了解如何更快地对这类问题进行故障排除还是很好的。
================================
我一直在使用最新的Exoplayer(2.9.5)开发一个应用程序(MediaPlayerActivity),并且最近在尝试膨胀股票视图时开始出现错误:
2019-02-12 21:36:43.339 25761-25761/E/TypefaceCompatApi21Impl: java.lang.NoSuchMethodException
java.lang.NoSuchMethodException: addFontWeightStyle [class java.lang.String, int, boolean]
at java.lang.Class.getMethod(Class.java:2068)
at java.lang.Class.getMethod(Class.java:1690)
at androidx.core.graphics.TypefaceCompatApi21Impl.<clinit>(TypefaceCompatApi21Impl.java:74)
at androidx.core.graphics.TypefaceCompat.<clinit>(TypefaceCompat.java:49)
at androidx.core.graphics.TypefaceCompat.create(TypefaceCompat.java:190)
at androidx.appcompat.widget.AppCompatTextView.setTypeface(AppCompatTextView.java:576)
at androidx.appcompat.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:217)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:103)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:93)
at androidx.appcompat.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:182)
at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1267)
at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1317)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:995)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:859)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.google.android.exoplayer2.ui.PlayerControlView.<init>(PlayerControlView.java:296)
at com.google.android.exoplayer2.ui.PlayerView.<init>(PlayerView.java:452)
at com.google.android.exoplayer2.ui.PlayerView.<init>(PlayerView.java:304)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
at android.view.LayoutInflater.createView(LayoutInflater.java:647)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at MediaPlayerActivity$MediaPagerAdapter.instantiateItem(MediaPlayerActivity.java:676)
我使用的是标准的ExoPlayer库存视图-没有自定义内容:
pager_video_item.xml中的布局:
<!-- Video Player -->
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"/>
错误开始的代码,在PagerAdapter实例中:
case Media.MEDIA_TYPE_VIDEO:
itemView = mLayoutInflater.inflate(R.layout.pager_video_item, container, false);
mLayoutInflater
在PagerAdapter构造函数中初始化:
class MediaPagerAdapter extends PagerAdapter {
final Context mContext;
final LayoutInflater mLayoutInflater;
MediaPagerAdapter(Context context) {
mContext = context;
mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
传递的上下文来自我的MediaPlayerActivity
类,该类扩展了androidx.appcompat.app.AppCompatActivity
(CFViewPager
扩展了ViewPager
,只是添加了一些逻辑来适当地处理触摸事件的分配。):
mViewPagerView = findViewById(R.id.activity_media_player_viewpager);
((CFViewPager) mViewPagerView).setAdapter(new MediaPagerAdapter(this));
我可以在同一台机器上构建并运行ExoPlayer演示,并且可以正常运行。很明显,我已经更改了应用程序中的某些设置,使运行时感到困惑。再次,这曾经在几天前完美地运行过。
我倾倒了版本控制差异,看不到我介绍的任何可能导致此问题的东西。
在堆栈跟踪中,尝试在PlayerControlView中充气TextView时似乎失败了。但是我不知道如何解决。
是什么会导致运行时突然想到无法使用反射在TypefaceCompatApi21Impl.java中找到addFontWeightStyle()方法?
Android Studio是最新的稳定版本(3.3.1) 我相信我的gradle文件是最新的:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
compileSdkVersion 28
defaultConfig {
applicationId "mycoolapp.com"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
构建工具设置为28.0.3
我已使缓存无效,然后重新启动,重建等。
感谢您对在哪里进行故障排除的想法。
答案 0 :(得分:5)
这是已经向Android团队报告的错误,并且似乎已准备好用于将来的版本:
https://issuetracker.google.com/issues/124274577
我猜他们指的是AndroidX库的未来版本。