如何解决Firebase Realtime数据库中ExoPlayer中的视频处理错误
我正在创建一个简单的视频应用程序,其中使用Firebase作为后端,但是当我从实时数据库中检索RecyclerView中的视频时,会出现数据处理错误。表示当我向下滚动我的RecyclerView观看更多视频,然后我向上滚动[Scroll Up]来观看较高的视频,但只有黑框而不是视频。
我的Java文件:-
import android.Manifest;
import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class FunnyActivity extends AppCompatActivity {
private static final int PERMISSION_STORAGE_CODE = 1000;
DatabaseReference databaseReference,likesrefernce;
RecyclerView recyclerView;
FirebaseDatabase database;
String name,url,downloadurl;
Boolean likechecker = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_funny);
recyclerView = findViewById(R.id.recyclerview_ShowVideo_fun);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
database = FirebaseDatabase.getInstance();
databaseReference = database.getReference("funny");
likesrefernce = database.getReference("likes");
}
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerOptions<Member> options =
new FirebaseRecyclerOptions.Builder<Member>()
.setQuery(databaseReference,Member.class)
.build();
FirebaseRecyclerAdapter<Member,ViewHolder> firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<Member,ViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull ViewHolder holder,int position,@NonNull Member model) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String currentUserId = user.getUid();
final String postkey = getRef(position).getKey();
holder.setExoplayer(getApplication(),model.getName(),model.getVideourl());
holder.setOnClicklistener(new ViewHolder.Clicklistener() {
@Override
public void onItemClick(View view,int position) {
name = getItem(position).getName();
url = getItem(position).getVideourl();
Intent intent = new Intent(FunnyActivity.this,FullScreen.class);
intent.putExtra("nam",name);
intent.putExtra("ur",url);
startActivity(intent);
}
@Override
public void onItemLongClick(View view,int position) {
}
});
holder.setLikesbuttonStatus(postkey);
holder.downloadbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_DENIED){
String permission = (Manifest.permission.WRITE_EXTERNAL_STORAGE);
requestPermissions(new String[]{permission},PERMISSION_STORAGE_CODE);
}else {
downloadurl = getItem(position).getVideourl();
startDownloading(downloadurl);
}
}else {
startDownloading(downloadurl);
}
}
});
holder.commentbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(FunnyActivity.this,CommentsActivity.class);
intent.putExtra("postkey",postkey);
startActivity(intent);
}
});
holder.likebutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
likechecker = true;
likesrefernce.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (likechecker.equals(true)){
if (dataSnapshot.child(postkey).hasChild(currentUserId)){
likesrefernce.child(postkey).child(currentUserId).removeValue();
likechecker = false;
}else {
likesrefernce.child(postkey).child(currentUserId).setValue(true);
likechecker = false;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item,parent,false);
return new ViewHolder(view);
}
};
firebaseRecyclerAdapter.startListening();
recyclerView.setAdapter(firebaseRecyclerAdapter);
}
private void startDownloading(String downloadurl) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadurl));
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |
DownloadManager.Request.NETWORK_MOBILE);
request.setTitle("Download");
request.setDescription("Downloading file...");
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,""+System.currentTimeMillis());
DownloadManager manager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
}
}
我的档案文件是:-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FunnyActivity">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recyclerview_ShowVideo_fun"/>
视频适配器是:-
import android.app.Application;
import android.net.Uri;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.extractor.ExtractorsFactory;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class ViewHolder extends RecyclerView.ViewHolder {
SimpleExoPlayer exoPlayer;
PlayerView playerView;
ImageButton likebutton,commentbtn,downloadbtn;
TextView likesdisplay;
int likescount;
DatabaseReference likesref;
public ViewHolder(@NonNull View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mClickListener.onItemClick(view,getAdapterPosition());
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
mClickListener.onItemLongClick(view,getAdapterPosition());
return false;
}
});
}
public void setLikesbuttonStatus(final String postkey) {
likebutton = itemView.findViewById(R.id.like_btn);
likesdisplay = itemView.findViewById(R.id.likes_textview);
downloadbtn = itemView.findViewById(R.id.download_button_viewholder);
commentbtn = itemView.findViewById(R.id.comment_activity_open);
likesref = FirebaseDatabase.getInstance().getReference("likes");
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String userId = user.getUid();
String likes = "likes";
likesref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.child(postkey).hasChild(userId)){
likescount = (int)dataSnapshot.child(postkey).getChildrenCount();
likebutton.setImageResource(R.drawable.ic_like);
likesdisplay.setText(Integer.toString(likescount)+likes);
}else {
likescount = (int)dataSnapshot.child(postkey).getChildrenCount();
likebutton.setImageResource(R.drawable.ic_dislike);
likesdisplay.setText(Integer.toString(likescount)+likes);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public void setExoplayer(Application application,String name,String Videourl) {
TextView textView = itemView.findViewById(R.id.tv_item_name);
playerView = itemView.findViewById(R.id.exoplayer_item);
textView.setText(name);
try {
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(application).build();
TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
exoPlayer = (SimpleExoPlayer) ExoPlayerFactory.newSimpleInstance(application);
Uri video = Uri.parse(Videourl);
DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory("video");
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
MediaSource mediaSource = new ExtractorMediaSource(video,dataSourceFactory,extractorsFactory,null,null);
playerView.setPlayer(exoPlayer);
exoPlayer.prepare(mediaSource);
exoPlayer.setPlayWhenReady(false);
} catch (Exception e) {
Log.e("ViewHolder","exoplayer error" + e.toString());
}
}
private ViewHolder.Clicklistener mClickListener;
public interface Clicklistener{
void onItemClick(View view,int position);
void onItemLongClick(View view,int position);
}
public void setOnClicklistener(ViewHolder.Clicklistener clicklistener){
mClickListener = clicklistener;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。