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

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

相关文章:

请求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 请求请求 andro…...

XML Schema 复合类型 - 混合内容

XML Schema 复合类型 - 混合内容 XML Schema 是一种用于定义 XML 文档结构和内容的语言。在 XML Schema 中&#xff0c;复合类型是一种包含其他元素和/或属性的复杂类型。混合内容&#xff08;Mixed Content&#xff09;是复合类型的一种特殊形式&#xff0c;它允许元素包含其…...

第8章 搬移特性

8.1 搬移函数 模块化是优秀软件设计的核心所在&#xff0c;好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序&#xff0c;我得保证互相关联的软件要素都能集中到一块&#xff0c;并确保块与块之间的联系易于查找、直观易懂。同时&#xff0c…...

ARM/Linux嵌入式面经(五九):海尔

1.以后打算在哪里工作 问题回答: 1. 以后打算在哪里工作? 回答这个问题时,我首先会考虑我的个人目标、职业规划以及家庭和生活因素。从职业发展的角度来看,我希望能够在技术氛围浓厚、创新能力强、且能提供良好职业成长机会的地方工作。具体来说,我对以下几个方向特别感…...

java中的List、数组和set

在Java中&#xff0c;List、数组&#xff08;Array&#xff09;和Set 是三种常用的数据结构&#xff0c;它们各自有不同的特性、用途和实现方式。下面我们将深入探讨这三者的特点、区别以及它们在 Java 中的常见使用场景。 1. 数组&#xff08;Array&#xff09; 特性&#x…...

freeswitch(配置文件结构)

vars.xml<X-PRE-PROCESS cmd="set" data="default_password=1234"/>default_password:设置默认密码,为安全起见,建议在部署后立即更改此密码,以防止盗用。<X-PRE-PROCESS cmd=<...

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

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

使用 esrally race 测试 Elasticsearch 性能:实践指南

在 Elasticsearch 性能优化和容量规划中&#xff0c;使用 esrally 进行基准测试是官方推荐的方式。通过 esrally race 命令&#xff0c;您可以针对不同的数据集与挑战类型&#xff0c;对 Elasticsearch 集群进行精确的性能评估。本文将简要介绍常用的数据集与挑战类型&#xff…...

OkHttp源码分析:分发器任务调配,拦截器责任链设计,连接池socket复用

目录 一&#xff0c;分发器和拦截器 二&#xff0c;分发器处理异步请求 1.分发器处理入口 2.分发器工作流程 3.分发器中的线程池设计 三&#xff0c;分发器处理同步请求 四&#xff0c;拦截器处理请求 1.责任链设计模式 2.拦截器工作原理 3.OkHttp五大拦截器 一&#…...

中国计算机学会计算机视觉专委会携手合合信息举办企业交流活动,为AI安全治理打开“新思路”

近期&#xff0c;《咬文嚼字》杂志发布了2024年度十大流行语&#xff0c;“智能向善”位列其中&#xff0c;过去一年时间里&#xff0c;深度伪造、AI诈骗等话题屡次登上热搜&#xff0c;AI技术“野蛮生长”引发公众担忧。今年9月&#xff0c;全国网络安全标准化技术委员会发布了…...

重生之我在异世界学编程之C语言:深入预处理篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xf…...

dolphinscheduler服务RPC框架源码解析(二)RPC核心注解@RpcService和@RpcMethod设计实现

1.工程目录 从3.2.1版本之后这个dolphinscheduler中的RPC框架工程就从原来的dolphinscheduler-remote工程重构到了dolphinscheduler-extract工程。 dolphinscheduler 父项目 dolphinscheduler-extract RPC服务项目 dolphinscheduler-extract-alert 监控告警服务RPC接口定义、…...

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…...

ARCGIS国土超级工具集1.2更新说明

ARCGIS国土超级工具集V1.2版本&#xff0c;功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG&#xff0c;新增了"矢量分割工具"菜单&#xff0c;同时增加及更新了了若干功能&#xff0c;新工具使用说明如下&#xff1a; 一、勘测定界工具栏更新界址点成果…...

暂停window11自动更新

window11 的自动更新功能&#xff0c;一方面在后台占用资源&#xff0c;容易导致电脑卡顿&#xff1b;另一方面&#xff0c;“更新并关机” 和 “更新并重启” 的设置令人极其反感。很多补丁兼容性很差&#xff0c;更新后极易引发电脑蓝屏、闪屏等意想不到的 bug。 1.winR打开运…...

Git简介和特点

目录 一、Git简介 二、Git特点 1.集中式和分布式 (1)集中式版本控制系统 (2)分布式版本控制系统 2.版本存储方式的差异 (1)直接记录快照&#xff0c;而非差异比较 3.近乎所有操作都是本地执行 一、Git简介 Git是目前世界上最先进的的分布式控制系统&#xff08;没有之一…...

如何通过docker 部署minio,端口号为9105

通过Docker部署MinIO对象存储服务&#xff0c;并指定API端口为9105&#xff0c;可以按照以下步骤进行。我们将基于已有的资料来详细说明这一过程。 1. 准备工作 首先&#xff0c;确保你的系统上已经安装了Docker。如果没有安装&#xff0c;可以根据官方文档指导完成安装。接下…...

设置Qt程序开机自启动(windows版本)

前言 本文展示在windows环境下&#xff0c;通过代码实现更改系统注册表的方式来实现程序的开机自动启动。 一、注册表 需要更改的系统注册表为: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 二、代码演示 1.头文件 头文件autorun.h #ifndef …...

【HarmonyOS】鸿蒙获取appIdentifier,Identifier

【HarmonyOS】鸿蒙获取appIdentifier&#xff0c;Identifier 一、前言 三方后台需要填写的所谓appIdentifier&#xff0c;Identifier信息&#xff0c;其实对应鸿蒙应用的appID。 二、解决方案&#xff1a; 注意&#xff0c;模拟器获取data.signatureInfo.appIndentifer为空…...

【Rust自学】3.5. 控制流:if else

3.5.0. 写在正文之前 欢迎来到Rust自学的第三章&#xff0c;一共有6个小节&#xff0c;分别是: 变量与可变性数据类型&#xff1a;标量类型数据类型&#xff1a;复合类型函数和注释控制流&#xff1a;if else&#xff08;本文&#xff09;控制流&#xff1a;循环 通过第二章…...

美国信息学奥林匹克竞赛USACO 2024年12月比赛铜级问题1. 循环舍入-答案代码

题目见&#xff1a; USACO 2024年12月比赛铜级问题1. 循环舍入(USACO 2024 December Contest, Bronze Problem 1. Roundabount Rounding) 最简单的青铜级 亲测所有得分点通过哈&#xff01; 下一篇会给解题分析哦&#xff01; #include <iostream> using namespace std;…...

Llama3模型详解 - Meta最新开源大模型全面解析

&#x1f4da; Meta最新发布的Llama3模型在开源社区引起广泛关注。本文将全面解析Llama3的技术特点、部署要求和应用场景。 一、模型概述 1. 基本信息 发布机构: Meta AI开源协议: Llama 2 Community License Agreement模型规格: 7B/13B/34B/70B训练数据: 2万亿tokens上下文长…...

2021-02-12 c++里面cin.sync()函数的意思

回复急~救救菜鸡吧&#xff0c;C用cin.clear()和cin.sycn()清空缓存区一直清不了!_编程语言-CSDN问答 标识符号为:goodbit 无错误 Eofbit 已到达文件尾 failbit 非致命的输入/输出错误可挽回 badbit 致命的输入/输出错误无法挽回 int a 0;cin >> a;if (cin.rdstate() i…...

下载红米Note 9 Pro5G对应的LineageOS代码下载及编译

构建 LineageOS 进入网站&#xff1a;Info about gauguin | LineageOS Wiki&#xff0c;点击&#xff1a;Build for yourself&#xff0c;里面有详细的教程&#xff0c;我这里就按照Note 9 Pro 5G来。 机器环境 Ubuntu环境为&#xff1a;20.04.6LinagesOS版本&#xff1a;21-…...

《探索 Caffe2 的 C++接口在移动设备上的性能优化之路》

在当今移动应用日益智能化的时代&#xff0c;将深度学习框架如 Caffe2 的 C接口应用于移动设备上已成为众多开发者的目标。然而&#xff0c;移动设备资源相对有限&#xff0c;如何优化其性能成为了关键挑战。 一、移动设备应用深度学习的现状与挑战 随着智能手机等移动设备的…...

1.编写一个程序,给定一个大写字母,要求用小写输出

思路&#xff1a;ascII码值 例如&#xff1a;A的ASCII码值为65&#xff0c;a的ASCII码值为97&#xff0c;不难发现&#xff0c;大小写字母之间的ascii值相差了32 #include <stdio.h> int main() {char c;scanf("%c",&c);printf("%c",c32);retu…...

条件随机场(CRF)详解:原理、算法与实现(深入浅出)

目录 1. 引言2. 什么是条件随机场&#xff1f;2.1 直观理解2.2 形式化定义 3. CRF的核心要素3.1 特征函数3.2 参数学习 4. 实战案例&#xff1a;命名实体识别5. CRF vs HMM6. CRF的优化与改进6.1 特征选择6.2 正则化 7. 总结与展望参考资料 1. 引言 条件随机场(Conditional Ra…...

Android Studio、JDK、AGP、Gradle、kotlin-gradle-plugin 兼容性问题

文章目录 问题&#xff1a;解决办法&#xff1a;gradle与 java的版本兼容AGP与Gradle的版本兼容kotlin 与 jvm 的版本兼容KGP、Gradle、AGP兼容关系kotlin 与 java 的编译版本配置 问题&#xff1a; 你从githb上clone了一个项目&#xff0c;本地跑的时候&#xff0c;各种报错。…...

防抖(Debounce)和节流(Throttle)的区别和应用场景

防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;虽然都是用来限制函数的执行频率&#xff0c;但它们的实现方式和应用场景有所不同。以下是两者的主要区别&#xff1a; 1. 执行原理 防抖&#xff08;Debounce&#xff09;&#xff1a; 执行条件&a…...

前端 Code Review 常见问题

在前端开发中&#xff0c;代码审查&#xff08;Code Review&#xff09;是一个至关重要的步骤。它不仅可以帮助团队成员之间共享知识和经验&#xff0c;还可以提高代码质量&#xff0c;减少错误和安全漏洞。以下是一些常见的前端 Code Review 问题和相应的解决方案。 1. 不一致…...