安卓开发:如何在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
相关产品推荐
相关产品推荐

