24

VideoView の onSurfaceTextureAvailable が呼び出されることはありません...テクスチャ
ビューを保持しているこのビューがあります。

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 は呼び出されません。

4

7 に答える 7

18

私にとっては、問題を解決するための鍵は、 AndroidManifest.xml のアクティビティに android:hardwareAccelerated="true" を追加することです。

スクロール コンテナー (ListView、ScrollView、ViewPager など) で TextureView を使用できるのは、ハードウェア アクセラレーテッド プロパティがオンになっている TextureView のアクティビティの場合のみです。

このブログの最後のいくつかの言葉は、

それがうまくいくことを願っています。

于 2013-11-11T03:43:35.870 に答える
12

TextureView を使用するには、ハードウェア アクセラレーションを有効にする必要があります。そうしないと、そのコールバック メソッドは呼び出されません。アクティビティの onCreate メソッドでそれを口に出すだけです:

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

それは私のために働いた。

于 2015-03-06T09:24:53.643 に答える
11

私の場合、最初はTextureView不可視で、データをフェッチした後にロードしたonSurfaceTextureAvailableため、呼び出されませんでした。TextureView「利用可能」であると言われるには、それが表示されている必要があると推測しています。私の解決策はTextureView、最初から見えるようにすることでした。

于 2014-10-14T00:30:32.263 に答える
4

私は同じ問題に遭遇しましたが、電話しonSurfaceTextureAvailableたことはありません。最後に、私のtextureview前に見えないことがわかりましたsetSurfaceTextureListenertextureviewということでまずはステータスチェック。

于 2016-07-13T10:59:53.123 に答える
3

私は同じ問題を抱えていましたが、不思議なことに次のコードで解決しました

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

さらに奇妙なことに、幅または高さのみを設定すると、どちらも機能しません。

于 2013-06-03T13:21:48.067 に答える