【问题标题】:MediaController mediaController = new MediaController(this); is showing error媒体控制器 mediaController = new MediaController(this);显示错误
【发布时间】:2018-06-23 05:16:07
【问题描述】:

我正在开发一个应用程序,我无法使用 RecyclerView 播放来自 Firebase 存储的视频。

但是当我尝试使用 context:"this" 声明 MeidaController 时,它显示错误。请检查我的代码。

当我在 NewsViewHolder 中声明 Mediacontroller 时出现错误。我不知道在哪里声明MediaController

NewsActivity(启动器)

package com.cornicore.newsapp;

import android.media.MediaPlayer;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.MediaController;
import android.widget.ProgressBar;
import android.widget.VideoView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;

public class NewsActivity extends AppCompatActivity {

    private RecyclerView mPeopleRV;
    private DatabaseReference mDatabase;
    private FirebaseRecyclerAdapter<News, NewsActivity.NewsViewHolder> mPeopleRVAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news); 


        setTitle("News");

        //"News" here will reflect what you have called your database in Firebase.
        mDatabase = FirebaseDatabase.getInstance().getReference().child("News");
        mDatabase.keepSynced(true);

        mPeopleRV = (RecyclerView) findViewById(R.id.myRecycleView);

        DatabaseReference personsRef = FirebaseDatabase.getInstance().getReference().child("News");
        Query personsQuery = personsRef.orderByKey();

        mPeopleRV.hasFixedSize();
        mPeopleRV.setLayoutManager(new LinearLayoutManager(this));

        FirebaseRecyclerOptions personsOptions = new FirebaseRecyclerOptions.Builder<News>().setQuery(personsQuery, News.class).build();

        mPeopleRVAdapter = new FirebaseRecyclerAdapter<News, NewsActivity.NewsViewHolder>(personsOptions) {
            @Override
            protected void onBindViewHolder(NewsActivity.NewsViewHolder holder, final int position, final News model) {

                holder.setVideo_url(getBaseContext(), model.getVideo_url());
            }

            @Override
            public NewsActivity.NewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.news_row, parent, false);

                return new NewsActivity.NewsViewHolder(view);
            }
        };

        mPeopleRV.setAdapter(mPeopleRVAdapter);
    }

    @Override
    public void onStart() {
        super.onStart();
        mPeopleRVAdapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        mPeopleRVAdapter.stopListening();


    }

    public static class NewsViewHolder extends RecyclerView.ViewHolder{

        View mView;

        public NewsViewHolder(View itemView){
            super(itemView);
            mView = itemView;
        }

        public void setVideo_url(Context ctx, String url){



            Uri uri = Uri.parse(url);
            VideoView videoView = (VideoView) mView.findViewById(R.id.video);
            videoView.setVideoURI(uri);
            videoView.requestFocus();
            videoView.start();


            ***MediaController mediaController = new MediaController(this);***

            videoView.setMediaController(mediaController);
            mediaController.setAnchorView(videoView);

            videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                @Override
                public boolean onInfo(MediaPlayer mp, int what, int extra) {
                    ProgressBar progressBar = (ProgressBar) mView.findViewById(R.id.progressBar);

                    if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END) {
                        progressBar.setVisibility(View.GONE);
                        return true;
                    }
                    else if(what == MediaPlayer.MEDIA_INFO_BUFFERING_START){
                        progressBar.setVisibility(View.VISIBLE);
                        return true;
                    }
                    return false;
                }
            });

        }
    }



}

【问题讨论】:

  • 您应该将context 传递给MediaController

标签: java android firebase firebase-storage mediacontroller


【解决方案1】:

更改MediaController mediaController = new MediaController(this);

MediaController mediaController = new MediaController(this.getActivity());

【讨论】:

    【解决方案2】:

    要解决这个问题,请创建一个Context 类型的全局变量,如下所示:

    private Context context;
    

    然后在你的 onCreate() 方法中初始化它:

    context = this;
    

    然后在创建MediaController 类的新对象时将这个context 对象传递给构造函数,如下所示:

    MediaController mediaController = new MediaController(context);
    

    【讨论】:

      【解决方案3】:

      使用“Exoplayer”代替 MediaController 或 VideoView。 这个对我有用。 我也在构建一个类似的应用程序,在研究了你的问题后,我将在我的应用程序中使用“FirebaseRecylerView”而不是 RecyclerView。 Exoplayer 开发者指南链接:https://google.github.io/ExoPlayer/guide.html

      【讨论】:

        【解决方案4】:

        添加:import android.widget.MediaController;

        您正在使用导入到会话。

        【讨论】:

        • 当您提供代码建议时,最好将格式设置为代码而不是使用粗体格式。您可以通过将 `` 添加到您的代码中来做到这一点
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        相关资源
        最近更新 更多