Intereting Posts
@IntDef аннотирование и возвращаемое значение из кода другого, который нельзя аннотировать или как временно отключить аннотацию от влияния на код? Привязка данных android к андроиду: фоновый атрибут с использованием строкового цветового кода Торговый счет на рынке Android Как установить BackgroundColor на ImageView на Android? Как добавить библиотеки поддержки? Как получить активность от Activity в TabHost? Google Plus Android SDK: ошибка раздувания класса com.google.android.gms.plus.PlusOneButton Безопасный вход в приложение Google Plus через приложение для Android Как добавить прокрутку к целому действию? Масштабирование миниатюр видео медленно прокручивается Выход из плагина Fabric Lolipop устройство не открывается в genymotion EditText вызывает onFocusChanged три раза, а не один раз Компиляция с Proguard дает SimException: «несоответствие типа локальной переменной» В чем разница между windowBackground и фоном для стиля деятельности?

Textureview onSurfaceTextureAvailable никогда не вызывается внутри relativelayout внутри фрагмента

OnSurfaceTextureAvailable в VideoView никогда не вызывается …
У меня есть это представление, которое удерживает текстуру.

public class MyMediaPlayer extends RelativeLayout{ Context mContext; VideoView player;//this is a custom textureview that streams video public MyMediaPlayer(Context context) { super(context); mContext = context; init(); } public MyMediaPlayer(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public MyMediaPlayer(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; init(); } private void init() { setBackgroundColor(Color.BLACK); player = new VideoView(mContext); LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); addView(player,lp); } public void setURL(String url){ player.setVideoPath(url); } public void start(){ player.start(); } } 

VideoView настроен следующим образом:

 public class VideoView extends TextureView { public VideoView(final Context context) { super(context); mContext = context; initVideoView(); } public VideoView(final Context context, final AttributeSet attrs) { super(context, attrs); mContext = context; initVideoView(); } public VideoView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; initVideoView(); } public void initVideoView() { Log.d(LOG_TAG, "Initializing video view."); videoHeight = 0; videoWidth = 0; setFocusable(false); setSurfaceTextureListener(surfaceTextureListener); } SurfaceTextureListener surfaceTextureListener = new SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(final SurfaceTexture surface, final int width, final int height) { Log.d(LOG_TAG, "Surface texture now avaialble."); surfaceTexture = surface; openVideo(); } @Override public void onSurfaceTextureSizeChanged(final SurfaceTexture surface, final int width, final int height) { Log.d(LOG_TAG, "Resized surface texture: " + width + '/' + height); surfaceWidth = width; surfaceHeight = height; boolean isValidState = (targetState == STATE_PLAYING); boolean hasValidSize = (videoWidth == width && videoHeight == height); if (mediaPlayer != null && isValidState && hasValidSize) { start(); } } @Override public boolean onSurfaceTextureDestroyed(final SurfaceTexture surface) { Log.i(LOG_TAG, "Destroyed surface number " + number); return false; } @Override public void onSurfaceTextureUpdated(final SurfaceTexture surface) { } }; } 

MyMediaPlayer устанавливается в xml фрагмента.
Если я поместил VideoView внутри фрагмента, тогда все будет хорошо.
Но если он находится в mymediaplayer внутри фрагмента onSurfaceTextureAvailable, он никогда не вызывается.

onSurfaceTextureAvailable , похоже, не вызван, если SurfaceTexture уже доступен. Вы можете проверить, доступен ли он, и вызвать метод onSurfaceTextureAvailable как onSurfaceTextureAvailable ниже.

 textureView.setSurfaceTextureListener(this); /* * onSurfaceTextureAvailable does not get called if it is already available. */ if (view.isAvailable()) { onSurfaceTextureAvailable(view.getSurfaceTexture(), view.getWidth(), view.getHeight()); } 

Что касается меня, ключом к решению проблемы является добавление android: hardwareAccelerated = "true" для активности в AndroidManifest.xml.

Вы можете использовать TextureView в прокручиваемом контейнере (например, ListView, ScrollView, ViewPager и т. Д.) Только в том случае, если активен для объекта TextureView с включенным аппаратным ограничением.

Последние несколько слов в этом блоге говорили о том, что

Надеюсь, это сработает для вас.

В моем случае я изначально имел свой TextureView невидимый, а затем загружался после извлечения некоторых данных, и это вызывало, что onSurfaceTextureAvailable не вызывался. Я предполагаю, что для TextureView который, как говорят, «доступен», он должен быть видимым. Мое решение состояло в том, чтобы просто сделать TextureView видимым с самого начала.

У меня была та же проблема, странно разрешил ее с помощью следующего кода

 videoPreview = (TextureView) linearLayout.findViewById(R.id.videoView); FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)videoPreview.getLayoutParams(); params.height = 130; params.width = 508; videoPreview.setLayoutParams(params); videoPreview.setSurfaceTextureListener(this); 

Более странно, если я устанавливаю только ширину или высоту, которую работает дозатор.

Вам нужно включить аппаратное ускорение для использования TextureView. Если вы этого не сделаете, его методы обратного вызова не будут вызваны. Просто надуть, что в методе onCreate вашей деятельности:

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 

Это сработало для меня.

Я столкнулся с той же проблемой, на onSurfaceTextureAvailable не был onSurfaceTextureAvailable . Наконец, я обнаружил, что мой textureview невидим перед setSurfaceTextureListener . Поэтому сначала проверьте статус textureview .