-1

I am developing an app where I have t play videos from Firebase Storage using RecyclerView.

But when I am trying to declare the MeidaController with context: "this", it is showing error. Please check my code.

The error comes when I am declaring Mediacontroller inside NewsViewHolder. I don't know where to declare the MediaController.

NewsActivity (Launcher)

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

        }
    }



}
Alex Mamo
  • 130,605
  • 17
  • 163
  • 193
Badal Kumar
  • 47
  • 2
  • 8

4 Answers4

1

change MediaController mediaController = new MediaController(this);

to

MediaController mediaController = new MediaController(this.getActivity());
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
Nearueki
  • 11
  • 1
0

To solve this, create a global variable of type Context like this:

private Context context;

Then initialize it in your onCreate() method:

context = this;

And then pass this context object to the constructor when you create a new object of the MediaController class like this:

MediaController mediaController = new MediaController(context);
Alex Mamo
  • 130,605
  • 17
  • 163
  • 193
0

Instead of MediaController or VideoView use 'Exoplayer'. It works for me. I am also building a similar app and after studying your question I am going to use 'FirebaseRecylerView' in my app instead of RecyclerView. Link to developer's guide of Exoplayer: https://google.github.io/ExoPlayer/guide.html

Monis Khan
  • 21
  • 5
0

add this: import android.widget.MediaController;

You are using the import to session.

  • As you're providing a code suggestion, it is a good practice to format as a code instead using bold format. You can do this by adding `` to your code – Isac Moura Jul 16 '20 at 20:19