# DLNASDK
**Repository Path**: lucifinilsu/DLNASDK
## Basic Information
- **Project Name**: DLNASDK
- **Description**: 一份轻量、易用的 Android DLNA/UPnP 投屏库,帮助开发者快速为应用集成媒体投屏功能。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2025-07-02
- **Last Updated**: 2025-12-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# DLNA 投屏 SDK
一份轻量、易用的 Android DLNA/UPnP 投屏库,帮助开发者快速为应用集成媒体投屏功能。
## ✨ 功能特性
- **设备发现**: 自动发现局域网内支持 DLNA/UPnP 的设备(如智能电视、电视盒子等)。
- **媒体投屏**: 支持将网络视频 URL 或本地视频文件投射到目标设备上播放。
- **HLS/M3U8 兼容**: 自动为 HLS (M3U8) 直播流生成兼容性元数据,提升在各类电视上的播放成功率。
- **播放控制**: 提供播放、暂停、停止等基本远程控制功能。
- **易于集成**: 设计简洁,只需几步即可集成到现有 Android 项目中。
---
## 🚀 快速接入
按照以下步骤,将 DLNA SDK 集成到您的 Android 项目中。
### 1. 添加依赖
**第 1 步:添加 JitPack 仓库**
在您的根目录 `settings.gradle.kts` 文件中,添加 JitPack 仓库地址:
```kotlin
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { setUrl("https://jitpack.io") } // 添加这一行
}
}
```
**第 2 步:添加 SDK 依赖**
在您的主应用模块(通常是 `app`)的 `build.gradle.kts` 文件中,添加 `DLNASDK` 的依赖:
```kotlin
dependencies {
// ...
implementation("com.gitee.lucifinilsu:DLNASDK:0.0.5")
}
```
### 2. 添加权限
为了进行网络通信和发现设备,需要在 `AndroidManifest.xml` 文件中声明以下权限:
```xml
```
---
## 📖 使用方法
SDK 的核心是 `DLNAManager`,它是一个单例,负责所有投屏相关的操作。
### 1. 初始化 SDK
在使用任何功能之前,首先获取 `DLNAManager` 的实例。
```java
DLNAManager dlnaManager = DLNAManager.getInstance();
```
### 2. 搜索设备
注册一个设备发现监听器,然后开始搜索。
```java
// 创建监听器来接收设备发现的回调
DLNAManager.DeviceDiscoveryListener discoveryListener = new DLNAManager.DeviceDiscoveryListener() {
@Override
public void onDeviceDiscovered(Device device) {
// 当发现新设备时回调
// 可以在这里更新 UI,将设备添加到列表中
Log.d("DLNA_SDK", "发现设备: " + device.getFriendlyName());
}
@Override
public void onDeviceRemoved(Device device) {
// 当设备离线时回调(当前版本暂未实现)
}
@Override
public void onDiscoveryFinished() {
// 当一轮搜索结束时回调(当前版本暂未实现)
}
};
// 注册监听器
dlnaManager.registerDeviceDiscoveryListener(discoveryListener);
// 开始搜索设备
dlnaManager.startSearch();
```
**注意**: 在不需要搜索时,请调用 `stopSearch()` 并注销监听器以释放资源。
```java
// 停止搜索
dlnaManager.stopSearch();
// 注销监听器
dlnaManager.unregisterDeviceDiscoveryListener(discoveryListener);
```
### 3. 选择设备并投屏
从发现的设备列表中选择一个设备,然后调用 `cast` 方法进行投屏。
```java
// 假设从设备列表中获取了一个 Device 对象
Device selectedDevice = deviceList.get(0);
dlnaManager.setSelectedDevice(selectedDevice);
// 投屏网络视频
String videoUrl = "http://example.com/video.mp4";
dlnaManager.cast(videoUrl, ""); // 第二个参数 metaData 暂时留空
// 投屏本地视频文件
// String localVideoPath = "/sdcard/Movies/myvideo.mp4";
// dlnaManager.cast(localVideoPath, "");
```
### 4. 播放控制
可以对当前投屏的视频进行播放、暂停和停止操作。
```java
// 播放
dlnaManager.play();
// 暂停
dlnaManager.pause();
// 停止
dlnaManager.stop();
```
### 5. 操作回调
可以设置一个回调来监听投屏和控制操作的结果。
```java
dlnaManager.setCallback(new DLNAManager.DLNAManagerCallback() {
@Override
public void onActionSuccess(String action) {
// 操作成功,action 的值为 "cast", "play", "pause", "stop"
Log.d("DLNA_SDK", action + " 操作成功");
}
@Override
public void onActionFailed(String action, String errorMessage) {
// 操作失败
Log.e("DLNA_SDK", action + " 操作失败: " + errorMessage);
}
});
```
---
## 📚 API 参考
### `DLNAManager`
| 方法 | 描述 |
| :--- | :--- |
| `getInstance()` | 获取 `DLNAManager` 的单例对象。 |
| `startSearch()` | 开始在局域网内搜索 DLNA 设备。 |
| `stopSearch()` | 停止设备搜索。 |
| `getDiscoveredDevices()` | 获取已发现的设备列表 (`List`)。 |
| `registerDeviceDiscoveryListener(listener)` | 注册设备发现监听器。 |
| `unregisterDeviceDiscoveryListener(listener)` | 注销设备发现监听器。 |
| `setSelectedDevice(device)` | 设置当前要操作的目标设备。 |
| `getSelectedDevice()` | 获取当前已选择的设备。 |
| `setCallback(callback)` | 设置操作结果的回调。 |
| `cast(url, metaData)` | 将指定的媒体 URL 投射到已选择的设备。`url` 可以是网络或本地路径。SDK 会自动处理 HLS (M3U8) 链接的元数据。 |
| `play()` | 控制设备开始或恢复播放。 |
| `pause()` | 控制设备暂停播放。 |
| `stop()` | 控制设备停止播放。 |
### `Device`
设备的数据模型,代表一个物理设备。
| 方法 | 描述 |
| :--- | :--- |
| `getFriendlyName()` | 获取设备的友好名称,通常显示在 UI 上。 |
| `getUdn()` | 获取设备的唯一设备名 (UDN),是设备的唯一标识符。 |
| `getIpAddress()` | 获取设备的 IP 地址。 |
| `getLocation()` | 获取设备描述文件 (XML) 的 URL。 |
| `getServices()` | 获取设备支持的所有服务的列表 (`List`)。 |
| `getService(serviceType)` | 根据服务类型(如 `urn:schemas-upnp-org:service:AVTransport:1`)获取特定的 `Service` 对象。 |
| `getPresentationUrl()` | 获取设备的展示页面 URL (如果有的话)。 |
### `Service`
服务的数据模型,代表设备提供的一项具体功能(如媒体播放)。
| 方法 | 描述 |
| :--- | :--- |
| `getServiceType()` | 获取服务的类型 URN。 |
| `getServiceId()` | 获取服务的 ID URN。 |
| `getControlURL()` | 获取该服务的控制端点 URL,用于发送 SOAP 指令。 |
| `getEventSubURL()` | 获取该服务的事件订阅 URL。 |
### `DeviceDiscoveryListener` (接口)
| 方法 | 描述 |
| :--- | :--- |
| `onDeviceDiscovered(device)` | 当发现一个新设备时被调用。 |
| `onDeviceRemoved(device)` | 当一个设备离线时被调用。 |
| `onDiscoveryFinished()` | 当一轮搜索结束时被调用。 |
### `DLNAManagerCallback` (接口)
| 方法 | 描述 |
| :--- | :--- |
| `onActionSuccess(action)` | 当一个操作(如 `cast`, `play`)成功时被调用。 |
| `onActionFailed(action, errorMessage)` | 当一个操作失败时被调用。 |