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

embedded/2024/12/22 2:28:28/

前端代码

添加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;@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.ppmy.cn/embedded/147684.html

相关文章

4.metagpt中的软件公司智能体 (ProjectManager 角色)

目录 基础流程1. 导入模块2. WriteTasks 类run 方法_update_tasks 方法_merge 方法_update_requirements 方法 3. ProjectManager 类4. 项目上下文初始化5. 生成 PRD 和 SYSTEM_DESIGN 文档6. 执行任务生成总结&#xff1a; 完整代码1. WriteTasks、ProjectManager类2. 数据准备…

Fabric8 Kubernetes Client 7.0.0内存泄漏深度分析与案例实践

Fabric8 Kubernetes Client 7.0.0内存泄漏深度分析与案例实践 摘要 在构建基于 Vert.x Http Proxy 开发业务聚合网关时&#xff0c;我们面临了内存泄漏挑战&#xff0c;该网关主要负责对接 Kubernetes API 并提供API服务。本文将介绍我们如何通过heapdump分析、普罗米修斯监控…

idea连不上mysql数据库

文章目录 可能是版本问题idea不是专业版时区问题useSSL的问题&#xff1a;要设置为true idea连不上mysql数据库有很多原因&#xff0c;有各种问题&#xff0c;其他问题大家上网一搜就能搜到 可能是版本问题 先查看版本 5.几就选择下面的版本创建 我就是这个问题 &#xff0c…

性能参数对比

在选择单片机型号时&#xff0c;需要根据具体的应用需求来选择合适的单片机。这一过程涉及到对应用环境、性能要求、功耗考虑、开发工具支持等多方面因素的综合评估。单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种将中央处理器&#xff08;CPU&#xff09;、…

如何对 Node.js更好的理解?都有哪些优缺点?哪些应用场景?

Node.js 简介 Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的 JavaScript 运行时环境&#xff0c;它允许开发者使用 JavaScript 来编写服务器端应用程序。Node.js 使用了事件驱动、非阻塞 I/O 模型&#xff0c;这使得它非常适合处理并发的、I/O 密集型的任务。 Node.js…

Android使用PorterDuffXfermode的模式PorterDuff.Mode.SRC_OUT实现橡皮擦,Kotlin(1)

Android使用PorterDuffXfermode的模式PorterDuff.Mode.SRC_OUT实现橡皮擦&#xff0c;Kotlin&#xff08;1&#xff09; import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import androi…

Android Audio实战——音频流数据dump(十)

在《Android Audio基础——音频链路分析》中已经对音频链路进行了分析,并且也分析了 dump pcm 数据的相关节点,这里我们来看一下 dump pcm 数据的详细代码。 一、上/下音频数据 1、Android.bp 源码位置:/frameworks/av/media/libaudioclient/Android.bp cc_library_shar…

STM32 水质水位检测项目(硬件架构)及(软件架构)

硬件选型 水位测量模块 TDS采集模块 外置ADC模块&#xff08;ADS1115&#xff09; 水位测量模块使用方法 水位测量原理 压力传感器&#xff1a;水越深压力越大 P ρgh Fps Fρgh*s P大气压 水位测量传感器本质上是一个压力测量传感器。压力的值和传感器产生的电压值是线…