Android 接入场景
临境直播观看 SDK 的接入可以通过两种场景;
一、原生场景:直接从 App 原生进入直播观看;
二、H5 嵌入场景:从嵌套在 webview 的 H5 中,进入直播观看;
原生场景
原生场景接入方式
- 首先接入临境直播观看 SDK,并配置相应环境,具体请参见 Android 接入说明文档。
- 直接在需要跳转的 Activity 里面添加如下代码:
//设置跳转到临境直播时对应的参数
LivePullIntentDataOptions options = new LivePullIntentDataOptions();
options.setLiveRoomCode("");//设置直播室roomCode
options.setLivePlayPwd("");//设置直播观看密码
options.setUserId("");//设置用户userId
options.setUserAvatar("");//设置用户头像url
options.setUserName("");//设置用户名
options.setUserLoginName("");//可选: 设置用户登录名
options.setUserPoint(0);//设置用户积分
//跳转到相应临境直播播放页面,context为Activity的实例
LivePullManager.intentToLjLive(context, options);
H5嵌入场景
H5嵌入场景接入方式
- 首先接入临境直播观看 SDK,并配置相应环境,具体请参见 Android 接入说明文档。
- 在app的webview中添加云学堂直播协议代理回调;
package com.yxt.demo.liveyxtsdk;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.GeolocationPermissions;
import android.webkit.JsPromptResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import com.yxt.sdk.live.pull.LivePullIntentDataOptions;
import com.yxt.sdk.live.pull.LivePullManager;
import org.json.JSONObject;
import java.util.Objects;
public class MainWebViewActivity extends AppCompatActivity {
protected WebView yxt_webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_web_test);
yxt_webview = findViewById(R.id.yxt_webview);
//webview基本属性设置
yxt_webview.getSettings().setJavaScriptEnabled(true);
yxt_webview.getSettings().setDefaultTextEncodingName("utf-8");
yxt_webview.getSettings().setGeolocationEnabled(true);
yxt_webview.getSettings().setLoadWithOverviewMode(true);//设置webView自适应屏幕大小
yxt_webview.getSettings().setSupportMultipleWindows(true);
yxt_webview.getSettings().setAppCacheEnabled(true);//设置H5的缓存打开,默认关闭
yxt_webview.getSettings().setDomStorageEnabled(true);
yxt_webview.getSettings().setLoadsImagesAutomatically(true);
yxt_webview.getSettings().setAllowFileAccess(true);
yxt_webview.getSettings().setAllowFileAccessFromFileURLs(true);
yxt_webview.getSettings().setPluginState(WebSettings.PluginState.ON);// 可以使用插件
yxt_webview.getSettings().setSupportMultipleWindows(true);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(yxt_webview, true);
}
//添加云学堂直播的 user agent
yxt_webview.getSettings().setUserAgentString(yxt_webview.getSettings().getUserAgentString() + " XuanLiveThirdPlatform/0");
yxt_webview.setWebChromeClient(new WebChromeClient() {
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
url = message;
Log.e("TAG", "onJsPrompt url: " + url);
return process(view, url, result);
}
});
yxt_webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
}
/**
* YXT协议处理
*
* @param webView
* @param url
* @param result
* @return
*/
public boolean process(WebView webView, String url, JsPromptResult result) {
if (!url.startsWith("http")) {
if (result != null) {
result.confirm();
result.cancel();
}
if (url.startsWith("yxtthirdapp://")) {
try {
Uri uri = Uri.parse(url);
String host = Objects.requireNonNull(uri.getHost()).toLowerCase();
// 域名 空判断
if (TextUtils.isEmpty(host)) {
return false;
}
String param = uri.getQueryParameter("param");
JSONObject jsonObject = new JSONObject(param);
String name = jsonObject.optString("name", "");
if ("yxt_app_live_open".equals(name)) {
String roomcode = jsonObject.optString("roomid", "");
String password = jsonObject.optString("password", "");
LivePullIntentDataOptions options = new LivePullIntentDataOptions();
options.setLivePlayPwd(password);
options.setLiveRoomCode(roomcode);
//传入真实用户身份 此处是测试写死的
options.setUserId("5ff44dff-82b5-4dd1-8a0a-c4c6a0a70733");
options.setUserName("王阳明");
options.setUserAvatar("https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eoKnUXeQnOQicPKWM8JHWH704OmhM3FRbq5icT5mhykg2NVL7epHuWIOmIDMBTCia5LiaTFmVL6Y9659Q/132");
LivePullManager.intentToLjLive(this, options);
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
return false;
}
@Override
public void onBackPressed() {
if (yxt_webview.canGoBack()) {
yxt_webview.goBack();
} else {
super.onBackPressed();
}
}
}
- 当获取到协议之后需要获取用户可用积分;
// 正式api地址
public static final String DEFAULT_FORMAL_BASE_API = "https://api-qida.yunxuetang.cn/v1/qdl/";
// 测试api地址
public static final String DEFAULT_TEST_BASE_API = "https://devinner.yunxuetang.com.cn/qidaliveapi/v1/";
/**
* 此API用于获取用户可用积分
*/
public static final String GETVALIDPOINTS = API地址 + "live/getvalidpoints";
public static void openLive(final Context mContext, final String roomId, final String playPwd) {
Alert.getInstance().showDialog();//此处是显示等待的loading效果 需自己实现
//此处为通过JavaAPI获取当前用户的可用积分,用于观看直播时对主播进行礼物赠送是的兑换
//HttpUtil需要自己实现 此处就是简单的get请求
//注意该请求头中需要携带以下参数
//1."Source" "506"
//2."Token" token从h5的localstorage获取
HttpUtil.get(GETVALIDPOINTS, new JsonHttpHandler() {
@Override
public void onSuccessJSONObject(int statusCode, JSONObject response) {
super.onSuccessJSONObject(statusCode, response);
//此处是获取到后台返回的积分是个jsonobject 此处需要在自己的http框架中解析得
//此处跳转直播
//设置跳转到临境直播时对应的参数
LivePullIntentDataOptions options = new LivePullIntentDataOptions();
options.setLivePlayPwd(playPwd);//设置直播观看密码
options.setLiveRoomCode(roomId);//设置直播室roomCode
options.setUserAvatar("");//设置用户头像url
options.setUserId("");//设置用户userId
options.setUserLoginName("");//设置用户登录名
options.setUserPoint(response.optInt("validPoints", 0));//设置用户积分
//跳转到相应临境直播播放页面,context为Activity的实例
LivePullManager.intentToLjLive(context, options);
}
@Override
public void onFailure(int statusCode, String responseString) {
super.onFailure(statusCode, responseString);
//获取失败,此处跳转直播积分为0
LivePullIntentDataOptions options = new LivePullIntentDataOptions();
options.setLivePlayPwd(playPwd);//设置直播观看密码
options.setLiveRoomCode(roomId);//设置直播室roomCode
options.setUserAvatar("");//设置用户头像url
options.setUserId("");//设置用户userId
options.setUserLoginName("");//设置用户登录名
options.setUserPoint(0);//设置用户积分
}
@Override
public void onFinish() {
super.onFinish();
Alert.getInstance().hideDialog();//此处是隐藏
等待的loading效果 需自己实现
}
});
}
关于作者
江苏云学堂网络科技有限公司开发人员,如有问题请发送邮件至
lingy@yxt.com
cuiqq@yxt.com。