当前位置: 首页 > article >正文

请求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类

package com.example.myapplication;
public class Video {
    private String url;

    public String getUrl() {
        return url;
    }
}

VideoService 接口类

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 类

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后端代码

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)
}


http://www.kler.cn/a/445825.html

相关文章:

  • 如何使用 WebAssembly 扩展后端应用
  • 点击展示大图预览
  • [Unity] 【VR】【游戏开发】在VR中使用New Input System获取按键值的完整教程
  • 小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书
  • word实现两栏格式公式居中,编号右对齐
  • 如何去设计一个消息队列
  • U盘出现USBC乱码文件的全面解析与恢复指南
  • Go 1.24即将到来!
  • [spring]XML配置文件标签
  • 通过smem 定时检测系统内存占用情况
  • windows下搭建本地sofa-registry
  • C哈的刷题计划之新矩阵(4)
  • Syslog 管理工具
  • 基于单片机的医院盒装药品自动分拣系统(论文+源码)
  • 充分利用 AIStor 的网络配置
  • 54、库卡机器人轴的软限位设置
  • flutter 使用dio 请求go语言后台数据接口展示瀑布流图片
  • EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3
  • opencv图片的纠正透视转换函数的应用,水印的添加,轮廓的绘制
  • 【Mysql】数据库分区技术详解
  • @FeignClient用于Nacos微服务间的接口调用
  • 微信小程序的消息头增加的字段不能有下滑线,字段大写字母自动转换消息字母
  • python学习——洛谷P2010 [NOIP2016 普及组] 回文日期 三种方法
  • Linux文件属性 -- 查看文件命令
  • Redis问题篇
  • 《探索 VR:开启沉浸式虚拟世界之旅》