textureview onSurfaceTextureAvailable n'a jamais appelé à l'intérieur de relativelayout à l'intérieur du fragment
onSurfaceTextureAvailable dans VideoView n'est jamais appelé...
J'ai ce point de vue qui est maintenant le 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 est mis en place comme ceci:
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 de configuration dans un fichier xml d'un fragment.
Si je place le VideoView à l'intérieur du fragment ensuite tout fonctionne bien.
Mais si c'est dans mymediaplayer à l'intérieur du fragment onSurfaceTextureAvailable n'est jamais appelée.
source d'informationauteur Amitay Molko
Vous devez vous connecter pour publier un commentaire.
onSurfaceTextureAvailable
ne semble pas appelée si leSurfaceTexture
est déjà disponible. Vous pouvez vérifier si elle est disponible et appelez votreonSurfaceTextureAvailable
méthode comme ci-dessous.Comme pour moi ,la clé pour résoudre le problème est que ajouter android:hardwareAccelerated="true" pour l'activité dans l'AndroidManifest.xml .
Vous pouvez utiliser TextureView dans un Défilement d'un Container(comme ListView,le ScrollView,ViewPager etc) que si l'activité de l'TextureView avec hardwareAccelerated bien sur.
Les derniers mots de ce blog mentionné que
Espère que cela fonctionne pour vous.
Dans mon cas, j'ai d'abord eu mon
TextureView
invisible, puis chargé après l'extraction de certaines données et cela a été l'origine deonSurfaceTextureAvailable
de ne pas être appelé. Je suppose que pourTextureView
être dit pour être "disponible", il doit être visible. Ma solution a été de faire de laTextureView
visible dès le début.Vous devez activer l'accélération matérielle pour utiliser TextureView. Si vous ne le faites pas, ses méthodes de rappel ne sera pas appelé. Juste pout que dans votre activité de la méthode onCreate:
Il a travaillé pour moi.
j'ai eu le même problème , étrangement résolu avec le code suivant
Plus étrangement si j'ai mis que la largeur ou la hauteur qui dosent travail.
J'ai rencontré le même problème,
onSurfaceTextureAvailable
ne s'est jamais appelé. J'ai enfin trouvé montextureview
est invisible avantsetSurfaceTextureListener
. Afin de vérifier l'état detextureview
au premier abord.essayer de mettre
mTextureView.setSurfaceTextureListener()
dansonCreate()
.RootCause est que:
onCreate()
->drawUI
->getHardwareLayer()
->callback SurfaceTextureListener
.Donc, pour résoudre ce problème:
setSurfaceTextureListener()
avant de l'INTERFACE utilisateur de dessiner ou redessiner l'INTERFACE utilisateur.