当前位置:首页 > 行业动态 > 正文

安卓如何获取网络视频

获取网络视频的两种方式

在安卓设备中获取网络视频主要有两种途径:直接下载到本地通过流媒体实时播放,以下是两种方法的实现思路及关键步骤。


直接下载网络视频到本地

权限配置

AndroidManifest.xml 中声明以下权限:

  • INTERNET:用于访问网络。
  • WRITE_EXTERNAL_STORAGE:用于保存文件到本地(Android 10+ 需适配分区存储)。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

动态申请存储权限(Android 6.0+)

在运行时请求存储权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}

使用 OkHttp 下载视频

添加依赖(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();

使用 ExoPlayer(高级方案)

添加依赖(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+ 需适配) 网络权限
文件管理 需处理文件路径和命名规则 无需管理本地文件

相关问题与解答

问题1:如何判断视频下载是否完成?

解答
在下载逻辑中,通过 onResponse 回调确认响应成功,并在输入流读取完毕后关闭输出流,可通过 HandlerBroadcastReceiver 通知主线程更新UI(如显示“下载完成”提示)。

问题2:如何处理大文件下载时的内存占用?

解答

  • 使用缓冲区(如 byte[1024])分块读写,避免一次性加载到内存。
  • 在子线程(如 AsyncTaskCoroutine)中执行下载任务。
  • Android 10+ 推荐使用 MediaStoreScoped Storage 替代直接文件路径