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

安卓开发:如何在DetailActivity的VideoView加载Firebase存储的视频

实现步骤

1. 补充网络权限

在线加载Firebase存储的视频必须申请网络权限,打开AndroidManifest.xml,在<application>标签同级位置添加以下权限声明:

<uses-permission android:name="android.permission.INTERNET" />

2. 确认视频URL格式合法

确保Adapter中myFoodList.get(i).getItemVideo()返回的是可公开访问的HTTPS下载链接,而非Firebase内部存储路径(gs://开头的路径VideoView无法识别)。

3. 修改DetailActivity核心逻辑

你当前的代码遗漏了从Intent获取视频URL、绑定播放控制器的逻辑,同时原有图片加载存在冗余错误,修改后的完整代码如下:

public class DetailActivity extends AppCompatActivity {

    TextView foodName, foodIngrediants, foodProcedure;
    ImageView foodImage;
    VideoView foodVideo;
    MediaController mediaController;

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

        foodName = findViewById(R.id.txtName);
        foodImage = findViewById(R.id.ivImage2);
        foodVideo = findViewById(R.id.ivVideo2);
        foodIngrediants = findViewById(R.id.txt_Ingrediants);
        foodProcedure = findViewById(R.id.txt_Procedure);

        // 初始化播放控制器(提供播放/暂停、进度拖动功能)
        mediaController = new MediaController(this);
        // 绑定控制器到VideoView,避免控制条脱离控件显示
        mediaController.setAnchorView(foodVideo);
        foodVideo.setMediaController(mediaController);

        Bundle mBundle = getIntent().getExtras();
        if (mBundle != null) {
            foodName.setText(mBundle.getString("Name"));
            foodIngrediants.setText(mBundle.getString("Ingrediants"));
            foodProcedure.setText(mBundle.getString("Procedure"));
            
            // 删除原有冗余的setImageResource调用,直接用Glide加载图片URL
            Glide.with(this)
                    .load(mBundle.getString("Image"))
                    .into(foodImage);

            // 获取Adapter传递的视频URL
            String videoUrl = mBundle.getString("Video");
            if (videoUrl != null && !videoUrl.isEmpty()) {
                // 给VideoView设置播放地址
                foodVideo.setVideoURI(Uri.parse(videoUrl));
                // 不需要自动播放可删除下行代码
                foodVideo.start();
            }

            // 处理播放异常,避免应用崩溃
            foodVideo.setOnErrorListener((mp, what, extra) -> {
                Toast.makeText(DetailActivity.this, "视频加载失败,请稍后重试", Toast.LENGTH_SHORT).show();
                return true;
            });
        }
    }
}

提示:代码中用到的Uri对应导入包为android.net.Uri,Toast对应导入包为android.widget.Toast,Android Studio会自动弹出导入提示,按Alt + Enter即可快速导入。

4. 可选优化:避免视频拉伸

打开activity_detail.xml布局文件,给VideoView节点添加adjustViewBounds="true"属性,让视频自动适配布局大小,不会出现变形拉伸。

注意:如果你的Firebase Storage中视频设置了私有访问权限,直接传HTTPS链接会加载失败,需要先将对应文件设置为公开可读,或者生成临时访问授权链接后再传递给VideoView。

内容的提问来源于stack exchange,提问作者Nomaan Pansare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 08:06:04