RecyclerView中VideoView点击跳转全屏播放的UriString错误求助
问题描述
我正在开发一款Android App,通过Firebase加载视频到GridLayout布局的RecyclerView的VideoView中,每个Fragment显示两个视频。我想为VideoView添加点击事件,点击后打开新Activity并以垂直全屏模式播放同一视频。使用putExtra传递数据时出现"uristring"错误,请求帮助解决该问题。
Adapter代码
package com.example.godhelpme.Adapter; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.MediaController; import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.recyclerview.widget.RecyclerView; import com.example.godhelpme.Fragments.HomeFragment; import com.example.godhelpme.FullScreen; import com.example.godhelpme.LoginActivity; import com.example.godhelpme.MainActivity; import com.example.godhelpme.Model.Post; import com.example.godhelpme.Model.User; import com.example.godhelpme.R; import com.example.godhelpme.StartActivity; 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.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.List; public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder>{ private Context mContext; private List<Post> mPosts; private FirebaseUser firebaseUser; public PostAdapter(Context mContext, List<Post> mPosts) { this.mContext = mContext; this.mPosts = mPosts; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.upload_item, parent,false); return new PostAdapter.ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); Post post = mPosts.get(position); try { String link = post.getVideourl(); MediaController mediaController = new MediaController(mContext); mediaController.setAnchorView(holder.video1); Uri video = Uri.parse(link); holder.video1.setMediaController(mediaController); holder.video1.setVideoURI(video); holder.video1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { try { if (mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = new MediaPlayer(); } mediaPlayer.setVolume(0f, 0f); mediaPlayer.setLooping(false); mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); } mediaController.setVisibility(View.GONE); } }); holder.video1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { mediaPlayer.start(); } }); holder.id.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent in = new Intent(view.getContext(),FullScreen.class); in.putExtra(" videourl", post.getVideourl()); in.putExtra("publisher", post.getPublisher()); in.putExtra("postid", post.getPostid()); view.getContext().startActivity(in); } }); }catch (Exception e){ Toast.makeText(mContext,e.getMessage(), Toast.LENGTH_SHORT).show(); } FirebaseDatabase.getInstance().getReference().child("Users").child(post.getPublisher()) .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { User user = snapshot.getValue(User.class); holder.id.setText(user.getUsername()); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } @Override public int getItemCount() { return mPosts.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public VideoView video1; public TextView id; public ViewHolder(@NonNull View itemView) { super(itemView); video1 = itemView.findViewById(R.id.video1); id = itemView.findViewById(R.id.id); } }
全屏播放Activity代码
package com.example.godhelpme; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.net.Uri; import android.os.Bundle; import android.widget.MediaController; import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; import com.example.godhelpme.Model.Post; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; public class FullScreen extends AppCompatActivity { VideoView videoFull; TextView idFull; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().hide(); setContentView(R.layout.activity_full_screen); videoFull = findViewById(R.id.videoFull); idFull = findViewById(R.id.idFull); Intent in = getIntent(); try{ String ttr = in.getStringExtra("videourl"); MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoFull); Uri video1 = Uri.parse(ttr); videoFull.setMediaController(mediaController); videoFull.setVideoURI(video1); }catch (Exception e){ Toast.makeText(this,e.getMessage(), Toast.LENGTH_SHORT).show(); } videoFull.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { mediaPlayer.start(); } }); idFull.setText(in.getStringExtra("publisher")); }
解决方案
核心问题
你在Adapter中传递Intent参数时,键名使用了" videourl"(注意开头有一个空格),但在FullScreen Activity中获取参数时用的是"videourl",导致获取到的视频地址为null,最终触发Uri.parse时的"uristring"错误。
修复步骤
修正Intent键名一致性
修改Adapter中的点击事件代码,去掉键名前的空格:holder.id.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent in = new Intent(view.getContext(),FullScreen.class); in.putExtra("videourl", post.getVideourl()); // 去掉键名前的空格 in.putExtra("publisher", post.getPublisher()); in.putExtra("postid", post.getPostid()); view.getContext().startActivity(in); } });添加空值判断(可选但推荐)
在FullScreen Activity中增加空值校验,避免空指针异常:Intent in = getIntent(); String ttr = in.getStringExtra("videourl"); if (ttr == null || ttr.isEmpty()) { Toast.makeText(this, "视频地址无效", Toast.LENGTH_SHORT).show(); finish(); // 关闭当前页面 return; } // 后续视频加载代码 MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoFull); Uri video1 = Uri.parse(ttr); videoFull.setMediaController(mediaController); videoFull.setVideoURI(video1);绑定点击事件到VideoView(可选)
如果你希望点击VideoView本身触发全屏播放,而不是点击TextView,将点击事件绑定到holder.video1:holder.video1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent in = new Intent(view.getContext(),FullScreen.class); in.putExtra("videourl", post.getVideourl()); in.putExtra("publisher", post.getPublisher()); in.putExtra("postid", post.getPostid()); view.getContext().startActivity(in); } });
内容的提问来源于stack exchange,提问作者Aditya Sharma
相关产品推荐
相关产品推荐

