安卓端SDK接入

安卓端 SDK:

步骤1  登录云手机控制台。

步骤2  单击“SDK管理”,单击“安卓 SDK”,进入SDK 接口说明页,支持下载集成文档及SDK程序包。

引入SDK包
安卓端Demo位置:*/Android/ simple-demo-migu
:类似云手机APK的客户端实现,在用户手机上运行的。
:详看demo中代码

1、 导入jar包

第一步:加载 sdk-device-out.jar,放入应用工程的libs目录下
第二步:在项目工程build.gradle添加以下依赖( ps:相关依赖库版本可以适当调整 )
dependencies {
// sdk需要的依赖
implementation 'com.blankj:utilcode:1.23.4'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.okhttp3:okhttp:3.8.1'
//仅有使用httpdns机制才需要。无用时可去除
api ('com.aliyun.ams:alicloud-android-httpdns:1.3.2.3@aar') {
transitive true
}
//仅有使用推送文件接口(pushFile)、拉取文件接口(pullFile)时需要。无用时可去除。
implementation 'com.huawei.storage:esdk-obs-android:3.1.3'
}

repositories {
//仅有使用httpdns机制才需要。无用时可去除
maven { url 'http://maven.aliyun.com/nexus/content/repositories/releases/'}
//仅有使用推送文件接口(pushFile)、拉取文件接口(pullFile)时需要。无用时可去除。
mavenCentral()
maven { url 'http://mirrors.huaweicloud.com/repository/maven/huaweicloudsdk/' }
maven { url 'http://mirrors.huaweicloud.com/repository/maven/' }
}
第三步:在项目proguard-rules.pro配置混淆(如果项目有使用混淆的话)
-keep class com.xuhao.didi.** {*;}## 保留包下的指定类及其内部类
-keep class com.cyjh.** {*;}## 保留包下的指定类及其内部类
-keep class com.ddyun.** {*;}## 保留包下的指定类及其内部类
本 SDK 目前支持 Android4.1(API版本为16) 及以上的系统版本,编译时请使用 Android6.0 或以上的版本 。

2、修改配置文件AndroidManifest.xml

< uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
 
<service
android:name="com.cyjh.ddy.media.service.MediaService"
android:exported="false" />
 
<meta-data
android:name="DDY_SDK_TYPE"
android:value="yunphone" />
<meta-data
android:name="DOMAIN_TYPE"
android:value="default" />
</application>

3、初始项目代码

一般在对应Application的子类中onCreate函数中初始化:
import com.cyjh.ddy.base.utils.CLog;
import com.cyjh.ddysdk.order.DdyOrderHelper;
{
…
//开放sdk打印日志
CLog.mPrintLog = true;
CLog.mLogPriority = Log.VERBOSE;
//HTTPDNS要早于友盟初始化,否则accountid会错误,https://help.aliyun.com/knowledge_detail/58422.html?spm=a2c4g.11186623.4.4.7c674c07HGzLia 第7点
//如果SDK UTDID冲突,看 https://help.aliyun.com/knowledge_detail/59152.html?spm=a2c4g.11186623.2.21.37756a4asgmQiu
//PS: 如果不想使用该功能,第二个参数填写false即可。
DdyOrderHelper.getInstance().initHTTPDNS(this, true);

4、测试

可先查看安卓Demo中使用相关接口的基本流程。
 
接口说明

1、sdk-order(订单管理)相关

/**订单管理协助类*/
DdyOrderHelper
/**请求用户登录。使用相关接口前必须先登录。回调会返回其它函数所需要的ucid参数
@param userName 租户下的用户名。对应为租户分配创建的用户的信息
@param password 租户下的用户的密码。
@param busDataListener 其回调函数,会返回其它函数所需要的ucid参数*/
public void requestUserLogin (String username, String password, final DdyOrderContract.TCallback<dkLoginRespone>busDataListener)
/**请求用户订单列表。使用相关接口前必须先登录。回调会返回其它函数所需要的DdyOrderInfo 、orderId参数
@param ucid 来自于 requestUserLogin接口的回调信息
@userToken 暂为空
@busDataListener 查询到的具体订单详情列表*/
public void requestOrderList(String ucid, String userToken, final DdyOrderContract.TCallback<ArrayList<DdyOrderInfo>> busDataListener)
/**请求订单详情。一般用于获取订单状态(是否正常等)。回调会返回其它函数所需要的DdyOrderInfo参数
@param orderId 订单信息中的订单号(云手机的唯一码)
@param ucid 登录成功后的账号信息中的ucid
@param deviceToken默认为空。
@param userToken 默认为空。
@busDataListener 查询到的具体订单详情列表*/
public void requestOrderDetail(long orderId, String ucid, final String deviceToken, final String UserToken, final DdyOrderContract.TCallback<DdyOrderInfo>busDataListener)
/**请求重启操作。状态通知是异步的,客户端需要定时(如10秒)刷新订单详情。
@param orderId 订单信息中的订单号(云手机的唯一码)
@param ucid 登录成功后的账号信息中的ucid
@param deviceToken默认为空。
@param UserToken默认为空。
@busDataListener 异常请求成功与否*/
public void requestOrderReboot(long orderId, String ucid, final String deviceToken, final String UserToken, final DdyOrderContract.Callback busDataListener)
/**请求重置操作。类似重启,也是异步通知。一般用于回收设备时的清空设备操作
@param orderId 订单信息中的订单号(云手机的唯一码)
@param ucid 登录成功后的账号信息中的ucid
@param deviceToken默认为空。
@param UserToken默认为空。
@busDataListener 异常请求成功与否*/
public void requestOrderReset(long orderId, String ucid, final String deviceToken, final String UserToken, final DdyOrderContract.Callback busDataListener)

2、sdk-device(设备控制)相关

2.1 设备媒体流协助类
DdyDeviceMediaHelper
/**初始化媒体流。container是指视频流要显示的父布局
@param userInfo订单详情(登录后的UCID及订单号(云手机的唯一码))
@param deviceToken 仅当考虑安全场景时考虑使用,其它情况下可空。
@param iHwySDKListener 其actionCodeCallback函数的ActionCode参数,定义了一些错误码及若干关键事件的通知。如视频连接成功,首帧加载、刚回到桌面、通知栏消息(默认未打开)等
@param container 云手机视频流显示的界面容器
@param isKeepConnect 是否在客户端后台时仍保持编码连接((它会一直占用编码资源)。正常情况下填写flase即可。*/
public boolean init(DdyUserInfo userInfo, String deviceToken, final IHwySDKListener iHwySDKListener, LinearLayout container, boolean isKeepConnect)


/**在playMedia之前的相关设置:设置视频流码率。默认为H264编码
@param div64Rate 建议值在600~2000间。多多云采用600 1000 1500 2000四档。
@param div65Rate 建议值在1000左右。需要额外申请开放H265支持,默认没开通的情况下,可填写空。*/
public void setPullStreamRate(String div64Rate, String div65Rate)


/**请求播放视频流。
@param orderId 订单信息中的订单号(云手机的唯一码)
@param ucid 登录成功后的账号信息中的ucid
@param userToken 可默认为空。PS:后端接收的推送订单状态信息接口,该参数会对应返回。
@ callback请求成功与否。*/
public void playMedia(long orderId, String ucid, String userToken, final DdyDeviceMediaContract.Callback callback)


/**切换媒体流:仅当视频流的界面布局不变化时使用
@param orderId 订单信息中的订单号(云手机的唯一码)
@param ucid 登录成功后的账号信息中的ucid
@ callback请求成功与否。*/
public void changeMedia(long orderId, String ucid, String userToken, final DdyDeviceMediaContract.Callback callback)


/**该设备执行相关按键动作。如主页、音量加减等
@param orderId 订单信息中的订单号(云手机的唯一码)
@param keyCode 对应安卓标准的按键KeyCode值。如KEYCODE_HOME,KEYCODE_VOLUME_DOWN等*/
public void doKeyEvent(long orderId, int keyCode)


/**反初始化媒体流。与init配对出现*/
public void uninit()
PS:IHwySDKListener 接口有autoRotateScreen回调屏幕旋转事件,此时视频流的UI控件会自动旋转。父布局的旋转需要外部自己再旋转。
PS: 该类还有静音开关接口:turnonAudio、turnoffAudio
2.2 设备常规命令协助类
DdyDeviceCommandHelper
/**设备截图。指定宽高,最大不超过720x1280。截图片总是竖屏方向的
@param orderInfo查询订单返回的信息
@param reqWidth要截图的宽(客户端应尽量使用小图,这样对用户的带宽消耗较小)
@param reqHeight要截图的高
@param iView 查询订单返回的信息*/
public void screencap(DdyOrderInfo orderInfo, long reqWidth, long reqHeight, DdyDeviceCommandContract.ScreenCap.IView iView )


/**获取设备已安装应用列表
@param orderInfo查询订单返回的信息
@param callback查询应用返回的信息*/
public void getAppsInfo(DdyOrderInfo orderInfo, DdyDeviceCommandContract.Callback<List<AppInfo>> callback)


/**启动指定应用
@param orderInfo查询订单返回的信息
@param packageName 应用包名
@param activityName应用Activity名
@param callback应用启动有结果时的回调。*/
public void runApp(DdyOrderInfo orderInfo, String packageName, String activityName, DdyDeviceCommandContract.Callback<Integer> callback)


/**启动指定应用
@param orderInfo查询订单返回的信息
@param action 对应的am start –a 时 action 的值
@param data 对应的am start –a 时 data 的值
@param callback应用启动有结果时的回调。*/
public void amStartApp((DdyOrderInfo orderInfo, String action, String data, DdyDeviceCommandContract.Callback<String> callback)
/*PS:云手机内部是执行shell指令: am start –a <action> –d <data>*/


/**当客户端出现异常或重启时,可查询上次的安装状态
@param orderInfo查询订单返回的信息
@param packageName对应应用的包名
@param callback 启动应用有结果时的回调 */
public void uninstallApps(DdyOrderInfo orderInfo, String packageName, DdyDeviceCommandContract.Callback<String> callback)
/*PS: Callback<String >值含义: 下载中:"4"; 安装中:"5"; 未安装:"6"; 已安装:”7”; */


/**卸载指定应用
@param orderInfo查询订单返回的信息
@param packageNames对应应用的包名列表
@param callback 卸载应用有结果时的回调 */
public void getInstallState(DdyOrderInfo orderInfo, List<String> packageNames, DdyDeviceCommandContract.Callback<Integer> callback)


/**关闭指定应用
@param orderInfo查询订单返回的信息
@param packageNames对应应用的包名列表
@param callback 卸载应用有结果时的回调 */
public void stopApps(DdyOrderInfo orderInfo, List<String> packageNames, DdyDeviceCommandContract.Callback<Integer> callback)


/**清空指定应用存储数据
@param orderInfo查询订单返回的信息
@param packageNames对应应用的包名列表
@param callback 清空应用数据有结果时的回调 */
public void clearApps(DdyOrderInfo orderInfo, List<String> packageNames, DdyDeviceCommandContract.Callback<Integer> callback)


/**更改设备的粘贴板内容
@param orderInfo查询订单返回的信息
@param callback 查询有结果时的回调 */
public void setClipBoard(DdyOrderInfo orderInfo, String text, DdyDeviceCommandContract.Callback <Integer> callback)


/**获取顶层应用包名
@param orderInfo查询订单返回的信息
@param callback 查询有结果时的回调 */
public void getTopApp(DdyOrderInfo orderInfo, DdyDeviceCommandContract.Callback <String> callback)


2.3 设备调试工具协助类
DdyDeviceToolHelper
/**拉取当前设备的logcat内容
@param orderInfo查询订单返回的信息
@param callback 查询有结果时的回调 */
public boolean logcatDevice(DdyOrderInfo orderInfo, DdyDeviceCommandContract.Callback <String> callback)


3、 常见接口或数据定义
3.1 数据定义SdkLoginRespone
/**
* 仅作为标记,响应类不混淆
* 响应的数据类型都需要继承这个接口
*/
*public abstract class ResponseData implements NoProGuard {
}
/**
* Created by xuwei on 2021/2/24.
*/
class SdkLoginRespone extends ResponseData {
public String UCID; //登录返回的用户UCID。供其它接口调用时使用
}
3.2 数据定义DdyOrderInfo
/**
* 订单信息详情。sdk层需要的基础信息
*/
public class DdyOrderInfo implements Parcelable, Serializable, NoProGuard {
//各类订单状态
/**
* 订单等待连接
*/
public static final int STATUS_Connecting = 1;

/**
* 订单运行中
*/
public static final int STATUS_Running = 2;

/**
* 结束中
*/
public static final int STATUS_Ending = 3;

/**
* 已经结束
*/
public static final int STATUS_Ended = 4;

/**
* 重启中
*/
public static final int STATUS_Rebooting = 5;

/**
* 结束异常
*/
public static final int TATUS_Ended_Exception = 6;

/**
* 重置中
*/
public static final int STATUS_Resetting = 7;

/**
* 设备回收恢复中
*/
public static final int STATUS_Recover_Optimization = 11;

/**
* 设备宕机恢复中
*/
public static final int STATUS_Recover_Exception = 12;

/**
* 设备续费恢复中
*/
public static final int STATUS_Recover_Recharge = 13;

/**
* 设备回收备份中
*/
public static final int STATUS_Backup_Optimization = 14;

/**
* 正常过期且有扩展服务
*/
public static final int STATUS_Deleted_Extend = 15;

/**
* 已删除(过期)
*/
public static final int STATUS_Deleted = -1;

/**
* 维护中
*/
public static final int STATUS_Maintaining = -2;

/**
* 数据备份后,处于删除可以续费状态
*/
public static final int STATUS_Deleted_Save = -4;

/**
* 续费后,没有可用设备状态
*/
public static final int STATUS_NO_Device = -5;

/**
* 设备异常备份失败
*/
public static final int STATUS_Data_Back_Fail = -6;

/**
* 设备回收后,数据恢复失败
*/
public static final int STATUS_Recovery_Normal = -7;

/**
* 设备异常后,数据恢复失败
*/
public static final int STATUS_Recovery_Ab_Normal = -8;

/**
* 抢购无设备
*/
public static final int STATUS_PanicBuyNoDev = -101;

/**
* 购买付费后无设备
*/
public static final int STATUS_PayBuyNoDev = -102;

public long OrderId; //订单号(云手机的唯一码)

public int OrderStatus; //状态值。参见上述STATE_*定义

public String OrderCreateTime; //订单创建时间

public String ProtectTime; //剩余保存时间
}
3.3 数据定义DdyUserInfo
/**
* sdk层需要的用户信息基础类
*/
public class DdyUserInfo implements NoProGuard {
public String UCID;

public long OrderId;
}
3.4 数据定义AppInfo
/**
* 应用信息.
*/
public class AppInfo {
public String packageName; //应用包名

public String activityName; //应用Activity名

public String name; //应用名

public String packagePath; //base.apk的路径

public String versionName; //版本号

public int versionCode; //内部版本号

public boolean isSystem; //是否是系统应用
}
3.5 接口定义DdyOrderContract.Callback
public interface DdyOrderContract extends NoProGuard {
interface Callback extends NoProGuard{
//针对渠道,sdk层某些数据不能暴露该块细节

void onSuccess(Object object);

void onFail(DdyOrderErrorConstants code, String msg);
}
interface TCallback <T> extends NoProGuard{
void onSuccess(T data);

void onFail(DdyOrderErrorConstants code, String msg);
}
}
3.6 接口定义IHwySDKListener
/**
* 外部界面或逻辑层需要实现的接口(SDK层)
* PS:隐藏了部分sdk不需要的接口
*/
public interface IHwySDKListener {
interface Callback extends NoProGuard{
/**
* 媒体库主要事件回调(正常连接,异常断开,正常退出等)
* @param code {@link ActionCode}
* @param msg 一些提示语(一般无法直接用于界面显示的)
*/
void actionCodeCallback(int code, String msg);

/**
* 显示fps
* @param fps (0~32)
*/
void upFps(String fps);

/**
* 显示ping
* @param pingRtt "21.733/23.854/27.477/1.016" 分别是:min/avg/max/mdev 值,一般取avg值即可
*/
void upPing(String pingRtt);

/**
* 手机内部切换视频时通知外部
* @param rotate 旋转角度 {@link ActivityInfo#SCREEN_ORIENTATION_PORTRAIT} or {@link ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}
*/
void autoRotateScreen(int rotate);

/**
* 获取云手机的粘贴板
* @param text
*/
void upClipboard(String text);

/**
* 通知栏消息 (默认未打开)
void upNoticeSyncInfo(NoticeSyncInfo noticeSyncInfo);

/**
* 反馈当前流量
* @param audioTraffic 音频流量 byte的个数
* @param videoTraffic 视频流量 byte的个数
*/
void upTraffic(long audioTraffic, long videoTraffic);

/**
* 解码一帧每秒平均时间
* @param frameTime
*/
void upFrameTime(long frameTime);
}
3.7 接口定义DdyDeviceMediaContract.Callback
/**
* 媒体流相关接口回调函数
*/
public interface DdyDeviceMediaContract extends NoProGuard {
interface Callback extends NoProGuard{
void success(Object obj);

void failuer(DdyDeviceErrorConstants errcode, String msg);
}
}
3.8 接口定义DdyDeviceCommandContract.ScreenCap.Iview
/**
* 设备常用命令:如应用安装,截图
*/
public interface DdyDeviceCommandContract extends NoProGuard {
/**
* 截图
*/
interface ScreenCap extends NoProGuard {
interface IView extends NoProGuard {
/**
* @param orderid
* @param imageBytes 外部可使用Glide.load().into()显示该图片数据
*/
void updateScreenCap(long orderid, byte[] imageBytes);

void updateScreenCapFailure(long orderid, DdyDeviceErrorConstants errcode, String msg);
}

void failuer(DdyDeviceErrorConstants errcode, String msg);
}
}
3.9 接口定义DdyDeviceCommandContract.Callback
/**
* 设备常用命令:如应用安装,截图
*/
public interface DdyDeviceCommandContract extends NoProGuard{
interface Callback <T> extends NoProGuard {
void success(Object obj);

void failuer(DdyDeviceErrorConstants errcode, String msg);
}
}
本文档内容整理自移动云官方帮助中心(查看原文),仅供参考。