You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"错误。

修复步骤

  1. 修正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);
        }
    });
    
  2. 添加空值判断(可选但推荐)
    在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);
    
  3. 绑定点击事件到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:35:22