在安卓设备中获取网络视频主要有两种途径:直接下载到本地或通过流媒体实时播放,以下是两种方法的实现思路及关键步骤。
在 AndroidManifest.xml
中声明以下权限:
INTERNET
:用于访问网络。WRITE_EXTERNAL_STORAGE
:用于保存文件到本地(Android 10+ 需适配分区存储)。<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在运行时请求存储权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); }
添加依赖(build.gradle
):
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
下载代码示例:
OkHttpClient client = new OkHttpClient(); String url = "https://example.com/video.mp4"; // 替换为实际视频URL Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理下载失败 } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { InputStream inputStream = response.body().byteStream(); File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "video.mp4"); FileOutputStream outputStream = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } outputStream.close(); inputStream.close(); // 下载完成后可通过广播或Handler通知UI } } });
VideoView
播放(基础方案)在布局文件中添加 VideoView
:
<VideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="wrap_content" />
设置视频URL并播放:
VideoView videoView = findViewById(R.id.videoView); String url = "https://example.com/video.mp4"; // 替换为实际视频URL videoView.setVideoURI(Uri.parse(url)); videoView.start();
添加依赖(build.gradle
):
implementation 'com.google.android.exoplayer:exoplayer:2.18.1'
初始化 ExoPlayer:
SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build(); PlayerView playerView = findViewById(R.id.playerView); playerView.setPlayer(player); MediaItem mediaItem = MediaItem.fromUri(Uri.parse(url)); player.setMediaItem(mediaItem); player.prepare(); player.play();
项目 | 下载到本地 | 流媒体播放 |
---|---|---|
适用场景 | 需要离线观看或长期保存视频 | 即时播放,节省存储空间 |
性能消耗 | 下载时占用存储和流量 | 实时缓冲,流量持续消耗 |
依赖库 | OkHttp/Retrofit | ExoPlayer/MediaPlayer |
权限需求 | 存储权限(Android 10+ 需适配) | 网络权限 |
文件管理 | 需处理文件路径和命名规则 | 无需管理本地文件 |
解答:
在下载逻辑中,通过 onResponse
回调确认响应成功,并在输入流读取完毕后关闭输出流,可通过 Handler
或 BroadcastReceiver
通知主线程更新UI(如显示“下载完成”提示)。
解答:
byte[1024]
)分块读写,避免一次性加载到内存。AsyncTask
或 Coroutine
)中执行下载任务。MediaStore
或 Scoped Storage
替代直接文件路径