请求go web后端接口 java安卓端播放视频

前端代码

添加gradle依赖

复制代码
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

添加访问网络权限

复制代码
<uses-permission android:name="android.permission.INTERNET" />

允许http 请求请求

复制代码
android:usesCleartextTraffic="true"

video类

java 复制代码
package com.example.myapplication;
public class Video {
    private String url;

    public String getUrl() {
        return url;
    }
}

VideoService 接口类

java 复制代码
package com.example.myapplication;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.GET;

public interface VideoService {
    @GET("/videos")
    Call<List<Video>> getVideos();
}

MainActivity 类

java 复制代码
package com.example.myapplication;

import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.VideoView;
import android.widget.Toast;
import android.media.MediaPlayer;
import androidx.appcompat.app.AppCompatActivity;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private VideoView videoView;

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

        videoView = findViewById(R.id.videoView);

        // 初始化 Retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.110.148:8080") // 修改为你的 Go 后端地址
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        VideoService service = retrofit.create(VideoService.class);
        Call<List<Video>> call = service.getVideos();

        showToast("Starting Retrofit call to get videos");

        call.enqueue(new Callback<List<Video>>() {
            @Override
            public void onResponse(Call<List<Video>> call, Response<List<Video>> response) {
                if (response.isSuccessful() && response.body() != null) {
                    List<Video> videos = response.body();
                    if (!videos.isEmpty()) {
                        String videoUrl = videos.get(0).getUrl();
                        showToast("Received video URL: " + videoUrl); // 打印 URL 进行调试
                        playVideo(videos.get(0).getUrl()); // 播放第一个视频
                    } else {
                        showToast("No videos found in the response");
                    }
                } else {
                    showToast("Failed to fetch videos, Response code: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<List<Video>> call, Throwable t) {
                showToast("Error fetching videos: " + t.getMessage());
                t.printStackTrace();
            }
        });
    }

    private void playVideo(String videoUrl) {
        showToast("Attempting to play video with URL: " + videoUrl);

        String fullUrl = "http://192.168.110.148:8080" + videoUrl; // 完整视频 URL
        showToast("Full video URL: " + fullUrl);

        Uri videoUri = Uri.parse(fullUrl);
        showToast("Parsed URI: " + videoUri.toString());

        videoView.setVideoURI(videoUri); // 使用 setVideoURI 方法

        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                showToast("Video is prepared, starting playback.");
                videoView.start(); // 开始播放
            }
        });

        videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                showToast("Error occurred while playing video. What: " + what + ", Extra: " + extra);
                return true; // 返回 true 表示我们已经处理了错误
            }
        });
    }

    // 用于显示 Toast 信息的辅助方法
    private void showToast(String message) {
        Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
    }
}

go后端代码

Go 复制代码
package main

import (
	"encoding/json"
	"net/http"
)

// Video 代表一个视频结构
type Video struct {
	URL string `json:"url"`
}

// VideoList 返回的视频列表
var videoList = []Video{
	{URL: "/videos/video1.mp4"}, // 本地视频地址
	{URL: "/videos/video2.mp4"}, // 本地视频地址 http://192.168.0.104:8080/videos/video2.mp4
}

func main() {
	// 在根目录下提供静态文件服务
	http.Handle("/videos/", http.StripPrefix("/videos/", http.FileServer(http.Dir("./videos"))))
	http.HandleFunc("/videos", getVideos)
	http.ListenAndServe(":8080", nil)
}

// getVideos 处理视频请求
func getVideos(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(videoList)
}
相关推荐
benbenAItalk9 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl9 小时前
Java学习二 基本语法2, 算术运算符
java·学习
niucloud-admin9 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885729 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户9 小时前
Java锁
java·开发语言
西瓜太郎123410 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
shehuiyuelaiyuehao11 小时前
1计算机是如何工作的
java·计算机网络
一航jason12 小时前
Android平台推理框架及试用场景模型对比
android·人工智能·ai·架构·ai编程·llama
陈随易12 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
一航jason12 小时前
Android 端侧大模型推理框架对比
android·人工智能·ai·ai编程·llama·ai-native