textureview onSurfaceTextureAvailable ніколі не называлі ўнутры RelativeLayout ўнутры фрагмента

onSurfaceTextureAvailable ў VideoView ніколі не называюць ...
У мяне ёсць гэты від, што трымае ў textureview.

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 ніколі не выклікаецца.

16
гэта працуе цяпер? не маглі б вы падзяліцца ўзор раствора або прыклад праекта?
дададзена аўтар keybee, крыніца

7 адказы

onSurfaceTextureAvailable doesn't seem to get called if the SurfaceTexture is already available. You can check if it is available and call your onSurfaceTextureAvailable method like below.

textureView.setSurfaceTextureListener(this);

/*
 * onSurfaceTextureAvailable does not get called if it is already available.
 */
if (view.isAvailable()) {
    onSurfaceTextureAvailable(view.getSurfaceTexture(), view.getWidth(), view.getHeight());
}
13
дададзена
што Выгляд у кантэксце?
дададзена аўтар Danpe, крыніца
Я думаю, што Выгляд павінен быць такім жа, як textureView на першай лініі.
дададзена аўтар yuzeh, крыніца
Калі вы выклікаеце setSurfaceTextureListener пасля таго, як паверхня даступная, вы не атрымаеце onSurfaceTextureAvailable зваротнага выкліку.
дададзена аўтар Steve Prentice, крыніца
Але як паверхня можа быць даступная і onSurfaceTextureAvailable ня выклікаецца? Я паглядзеў у зыходны код TextureView, і я не магу бачыць, што магчыма.
дададзена аўтар PerracoLabs, крыніца

Што тычыцца мяне, ключ да вырашэння гэтай праблемы з'яўляецца тое, што дадаць АНДРОІД: hardwareAccelerated = "ісціна" для дзейнасці ў AndroidManifest.xml.

Вы можаце выкарыстоўваць TextureView ў Scrolling-кантэйнер (напрыклад, ListView, ScrollView, ViewPager і г.д.), толькі калі дзейнасць па TextureView з hardwareAccelerated уласнасці на.

Апошнія некалькі слоў у гэтым блогу згадваецца, што

Спадзяюся, што гэта працуе для вас.

11
дададзена
Мая праблема была вырашана ўручную выкліку onSurfaceTextureAvailable . Я не думаю, што ўстаноўка hardwareAccelerated = «праўдзівы» дапаможа шмат новых праектаў, так як апаратнае паскарэнне ўключана па змаўчанні Мэтавы ўзровень API> = 14 .
дададзена аўтар VinceFior, крыніца

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

7
дададзена
гэта працуе для мяне таксама
дададзена аўтар Pranoy C, крыніца

Вам неабходна ўключыць апаратнае паскарэнне для выкарыстання TextureView. Калі вы гэтага не зробіце, яго метаду зваротнага выкліку не будзе выклікана. Проста дзьмуцца, што ў OnCreate метад вашай дзейнасці па:

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

Ён працаваў для мяне.

4
дададзена

я была такая ж праблема, як ні дзіўна вырашыць яго з дапамогай наступнага кода

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);

Больш дзіўна, калі я ўсталяваць толькі шырыню або вышыню, альбо працу дацэнта.

3
дададзена
Гэта рашэнне працуе для мяне, але сітуацыя была ў сувязі з больш сур'ёзнай праблемай: погляд не закладваў сябе належным чынам. Выгляд бацькоўскага макета (карыстацкі ViewGroup) не клікалі View.measure (...) правільна на бацьку гледжання тэкстуры ст. Я проста павінен быў выправіць свой кантроль ViewGroup.
дададзена аўтар Andrew Shepherd, крыніца
я сапраўды не ведаю .. я эксперыментаваў, і гэта тое, што працуе для мяне.
дададзена аўтар Rany A. Ishak, крыніца
Але што з'яўляецца прычынай рашэння? Для таго, каб змясціць выпадковы памер?
дададзена аўтар PerracoLabs, крыніца

Я сустракаўся з такой жа пытанне, onSurfaceTextureAvailable ніколі не тэлефанаваў. Нарэшце я знайшоў textureview нябачны перад setSurfaceTextureListener . Такім чынам, праверце стан textureview у першай.

0
дададзена
Сардэчна запрашаем у StackOverflow! У наступны раз, паспрабуйце адправіць парады, як гэта ў раздзеле каментароў
дададзена аўтар cdomination, крыніца
Thx, я буду супраць.
дададзена аўтар San Zhang, крыніца

паспрабуйце паставіць mTextureView.setSurfaceTextureListener() у OnCreate() .

RootCause is that: onCreate() -> drawUI -> getHardwareLayer() -> callback SurfaceTextureListener. So to fix this issue: setSurfaceTextureListener() before UI draw or redraw the UI.

0
дададзена