请求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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);videoView = findViewById(R.id.videoView);// 初始化 RetrofitRetrofit 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>>() {@Overridepublic 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());}}@Overridepublic 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; // 完整视频 URLshowToast("Full video URL: " + fullUrl);Uri videoUri = Uri.parse(fullUrl);showToast("Parsed URI: " + videoUri.toString());videoView.setVideoURI(videoUri); // 使用 setVideoURI 方法videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {showToast("Video is prepared, starting playback.");videoView.start(); // 开始播放}});videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic 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 mainimport ("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.mzph.cn/bicheng/64359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARMS 用户体验监控正式发布原生鸿蒙应用 SDK

作者&#xff1a;羿莉 背景 对企业数据进行敏感数据扫描和保护可以提升企业或组织的数据安全。一方面敏感数据可能包括个人身份信息、财务记录、医疗记录等&#xff0c;定期扫描这些数据可以防止未经授权的访问和泄露。 另一方面&#xff0c;许多国家和地区都有关于数据保护的…

CSS学习记录14

CSS不透明度 opacity属性指定元素的不透明度/透明度。opacity属性的取值范围为0.0 ~ 1.0。 值越低&#xff0c;越透明&#xff1a; img {opacity: 0.5; } opacity属性通常与:hover选择器一同使用&#xff0c;这样就可以在鼠标悬停时更改不透明度&#xff1a; img {opacity: 0…

【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节

现象 在yasql执行sql语句后报错&#xff1a;YASQL-00021 input line overflow (>4000 byte at line 4) 原因 yasql在交互模式模式下单行字符总量限制4000字节&#xff0c;超出该限制即报错。 交互式模式下&#xff0c;yasql会显示一个提示符&#xff0c;通常是 SQL>…

为何ZLG致远电子要推出LGA嵌入式核心板?

LGA嵌入式核心板究竟有什么好&#xff1f;能让ZLG致远电子陆续推出了5个系列12个型号的LGA嵌入式核心板。 到目前为止&#xff0c;ZLG致远电子一共推出了M1106/M1107、M1126、M6Y2C、 A6Y2C、MR6450等5个系列&#xff0c;共12个型号的LGA形态的嵌入式核心板&#xff0c;涵盖了A…

开源实时多模态AI Agent,搭载Gemini多模态API(在线体验)

今天发现一个惊艳的开源项目&#xff0c;利用多模态大模型API进行多智能体交互。支持RAG、搜索等。 TEN Agent 是一款由 TEN 提供支持的对​​话式 AI&#xff0c;集成了 Gemini 2.0 Multimodal Live API、OpenAI Realtime API、RTC 等。它提供实时的看、听和说功能&#xff0…

C++小白实习日记——Pollnet,Efvi,UDP,数据类型转换(下)

内容太多了&#xff0c;这篇记录UDP接收端 一&#xff0c;UDP接收端接收数据 有了pollnet这个开源项目的支持&#xff0c;接收端的步骤为&#xff1a;1&#xff09;初始化硬编码的参数&#xff1a;接口&#xff0c;IP和端口 2&#xff09;创建接收文件.csv 3&#xff09;读…

【ROS2】坐标TF入门

1、简介 1)定义: TF(TransForm)是用于坐标系管理的工具,它提供了快速、高效的坐标变换和时间同步功能。 2)坐标系 坐标系:在机器人系统中,存在多个坐标系,如基坐标系(Base Frame)、世界坐标系(World Frame)、工具坐标系、工件坐标系等。这些坐标系之间的关系在机…

[创业之路-197]:华为的成立发展与新中国的建立与发展路径的相似性比较

目录 一、公司比较 1、创业初期的艰难与挑战 2、坚持自主创新与研发 3、市场拓展与国际化战略 4、企业文化与社会责任 5、面临的挑战与应对策略 二、任正非管理企业的思想大量借鉴了毛泽东建国的思想 1、矛盾论与企业管理 2、群众路线与企业文化 3、战略思维与长远发…

Loadsh源码分析-filter,find,findLast,reject,partition

lodash源码研读之filter,find,findLast,reject,partition 一、源码地址 GitHub 地址: GitHub - lodash/lodash: A modern JavaScript utility library delivering modularity, performance, & extras.官方文档地址: Lodash 官方文档 二、结构分析 结构框图省略。 三、函…

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之字符类型

要进行计算机程序设计&#xff0c;不仅仅进行科学数值类型计算&#xff0c;还需要处理一些文本信息&#xff0c;这就需要字符类型。在C中字符可以表示字母、符号等&#xff0c;在编程的时候&#xff0c;通常使用一对单引号括起来&#xff0c;例如&#xff1a;A,a,B,b,0等。字符…

Spring Boot 2.1.7 数据源自动加载过程详解

在 Spring Boot 中&#xff0c;数据源的自动配置是框架中一个关键功能&#xff0c;本文将以 Spring Boot 2.1.7 版本为例&#xff0c;详细讲解在单数据源情况下数据源是如何自动加载的。我们通过源码分析&#xff0c;追踪整个加载流程。 1. 自动配置类的发现 Spring Boot 使用…

Node.js第三方模块

1.npm 简介 npm:node package manager 是一个nodejs的包管理和开发工具。 2.npm作用 (提供第三方的安装模块) 1. 从npm服务器下载别人写的第三方js库包到本地使用。 2. 从npm服务器下载并安装第三方命令行程序到本地使用。 3. 将自己写的包或命令行程序上传到n…

剑指Offer 03比特位计数

只是记录 题目链接 题目链接 自己想出来的 第一种解法 思路简述 遍历[0,n]之间的数字&#xff0c;对于每一个数字按照二进制的方式展开&#xff0c;判断最低位置是否为1&#xff0c;若为1则1&#xff0c;反之不加&#xff0c;直到该数字等于0就停止。 public static int[] …

C# 23种设计模式(4)访问者模式(Visitor Pattern)

一、访问者模式介绍 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你以一种新的方式来增加作用于一组对象的操作&#xff0c;而无需修改这些对象类的代码。访问者模式将数据操作与数据结构分离&#xff0c;适用于数据结构相对稳定但…

MySQL 锁机制详解

1 引言 在数据库系统中&#xff0c;锁是确保数据一致性和完整性的关键机制之一。MySQL提供了多种类型的锁来支持不同场景下的并发控制需求。本文将详细介绍MySQL中的主要锁类型&#xff0c;包括行级锁、表级锁、意向锁等&#xff0c;并探讨它们的工作原理及应用场景。 2 锁的基…

某j 全局控制输入框不能输入表情符

在FormItem.vue文件中的function handleRules()添加两处表情正则校验&#xff0c;代码如下 效果&#xff1a; function handleRules(): ValidationRule[] {const { rules: defRules [], component, rulesMessageJoinLabel, label, dynamicRules, required } props.schema;if…

java中File类

1、介绍 File类定义了一些与平台无关的方法来操作文件&#xff0c;可以通过调用File类中的方法&#xff0c;实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息&#xff0c;如文件所在的目录、文件长度、文件读写权限等。数据流可以将数据写入到文…

Linux高性能服务器编程 | 读书笔记 | 10. 高性能I/O框架库Libevent

10. 高性能I/O框架库Libevent Linux服务器程序必须处理三类事件&#xff08;I/O、信号和定时事件&#xff09;&#xff0c;在处理这三类事件时需要考虑以下问题&#xff1a; **统一事件源。**统一处理这三类事件既能使代码简单易懂&#xff0c;又能避免一些潜在的逻辑错误。实…

Javaweb web后端maven介绍作用安装

自动导入到这个项目 src是源代码 main主程序&#xff0c;核心代码 java是Java源代码 resources是项目配置文件 test测试相关的 maven概述 介绍 依赖在本地仓库查找&#xff0c;如果本地仓库有&#xff0c;用本地仓库的依赖&#xff0c;本地没有&#xff0c;连接中央仓库&…

云计算HCIP-OpenStack01

1.OpenStack是什么&#xff1f; 1.1OpenStack是虚拟机、裸金属、容器的云基础架构 虚拟机、裸金属、容器&#xff0c;三者的相同点在于他们都是计算资源的封装&#xff0c;其所需要的资源是高度重合的。同时&#xff0c;这三类资源都属于是最基础的计算资源&#xff0c;也是云或…