Commit 6f802002 by 刘鹏

feat : 星链 倾诉日志

parent aa851d91
......@@ -361,12 +361,7 @@ public class WVClickAbstractListener implements WebViewClientClickListener {
@Override
public void confideConnect(H5JsBean.H5JsCmd.Params jsData) {
// ModularServiceManager.INSTANCE.provide(IConfideService.class).connectionJava(jsData.getId(),jsData.getConfideType(),mContext,null,jsData.getCallType());
((IConfideService) ARouter.getInstance().build("/confide/ConfideService").navigation()).connectionJava(jsData.getId(), 3, mContext, null, jsData.getCallType());
}
@Override
......
......@@ -5,7 +5,7 @@ ext {
ydlPublishVersion = [
// -------------- 业务模块 --------------
//第三步 若干
"m-confide" : "0.0.49.21",
"m-confide" : "0.0.49.25",
"m-consultant" : "0.0.60.03",
"m-fm" : "0.0.30.04",
"m-user" : "0.0.61.94",
......@@ -33,13 +33,13 @@ ext {
//-------------- 功能组件 --------------
//第一步
"ydl-platform" : "0.0.40.76",
"ydl-platform" : "0.0.40.77",
//第二步 若干
"ydl-webview" : "0.0.38.47",
"ydl-media" : "0.0.21.42",
"ydl-pay" : "0.0.18.19",
"m-audioim" : "0.0.49.29.45",
"m-audioim" : "0.0.49.29.46",
"ydl-flutter-base": "0.0.14.38",
//以下 几乎不会动
......@@ -88,7 +88,7 @@ ext {
// -------------- 业务模块 --------------
//第三步 若干
"m-confide" : "0.0.49.21",
"m-confide" : "0.0.49.25",
"m-consultant" : "0.0.60.03",
"m-fm" : "0.0.30.07",
"m-user" : "0.0.61.94",
......@@ -115,13 +115,13 @@ ext {
//-------------- 功能组件 --------------
//第一步
"ydl-platform" : "0.0.40.76",
"ydl-platform" : "0.0.40.77",
//第二步 若干
"ydl-webview" : "0.0.38.47",
"ydl-media" : "0.0.21.42",
"ydl-pay" : "0.0.18.19",
"m-audioim" : "0.0.49.29.45",
"m-audioim" : "0.0.49.29.46",
"ydl-flutter-base": "0.0.14.38",
//以下 几乎不会动
......
package com.ydl.audioim
import android.Manifest
import android.annotation.SuppressLint
import android.app.Service
import android.content.Context
......@@ -17,17 +16,17 @@ import android.os.Handler
import android.os.PowerManager
import android.os.Vibrator
import android.provider.Settings
import androidx.core.content.ContextCompat
import android.text.TextUtils
import android.view.View
import android.view.animation.AccelerateInterpolator
import androidx.core.content.ContextCompat
import com.alibaba.android.arouter.facade.annotation.Route
import com.google.gson.Gson
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.XXPermissions
import com.tbruyelle.rxpermissions2.RxPermissions
import com.ydl.audioim.bean.AgoraLogInfoBean
import com.ydl.audioim.contract.IAudioHomeActivityContract
import com.ydl.audioim.http.AudioApiRequestUtil
import com.ydl.audioim.http.command.ConnectCommand
import com.ydl.audioim.http.command.ConnectExceptionCommand
import com.ydl.audioim.http.command.NoticePushCommand
......@@ -225,22 +224,7 @@ class AudioHomeActivity :
//106:打开频道超时。查找到指定频道后,SDK 接着打开该频道,超时一般是因为网络太差,连接不到服务器
//107:打开频道请求被服务器拒绝。服务器可能没有办法处理该请求或该请求是非法的
// 声网发出警告错误码,不应该直接离开房间
// runOnUiThread {
// when (warn) {
// 103, 105, 107 -> {
// writeAgoraLog("通话挂断:网络异常(${warn})")
// showToast("当前网络较差,请更换网络!")
// //通话结束或挂断时,上传日志文件
// uploadLog()
// leaveChannel()
// YDLavManager.instances.callEndStatusUpdate(
// channelId!!,
// 4,
// "收到频道回调警告信息$warn"
// )
// }
// }
// }
}
override fun onError(err: Int) {
......@@ -261,32 +245,7 @@ class AudioHomeActivity :
//110:生成的 Token 无效
//123:此用户被服务器禁止
LogUtil.e("[agora]发生错误回调$err")
runOnUiThread {
when (err) {
3, 7, 109, 110 -> {
showToast("请退出应用,重新打开")
leaveChannel()
}
10 -> {
showToast("当前网络较差,请更换网络")
leaveChannel()
}
101 -> {
showToast("安装包有问题,请联系技术")
leaveChannel()
}
102 -> {
showToast("频道错误,请联系技术")
leaveChannel()
}
123 -> {
// showToast("当前用户不允许接听电话,请联系客服")
// leaveChannel()
}
}
YDLavManager.instances.callEndStatusUpdate(channelId!!, 4, "频道的错误回调信息$err")
}
YDLavManager.instances.callEndStatusUpdate(channelId!!, 4, "频道的错误回调信息$err")
}
override fun onApiCallExecuted(error: Int, api: String?, result: String?) {
......@@ -299,6 +258,8 @@ class AudioHomeActivity :
override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) {
super.onJoinChannelSuccess(channel, uid, elapsed)
callEventSave("40", "$uid 用户声网加入频道成功:channel=$channel")
LogUtil.e("[agora]$uid 用户声网加入频道成功:channel=$channel")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "$uid 用户声网加入频道成功:channel=$channel")
......@@ -316,6 +277,8 @@ class AudioHomeActivity :
override fun onRejoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) {
super.onRejoinChannelSuccess(channel, uid, elapsed)
callEventSave( "70", "$uid 用户声网加入频道成功:channel=$channel")
LogUtil.e("[agora]$uid 用户声网重新加入频道成功:channel=$channel")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "$uid 用户声网重新加入频道成功:channel=$channel")
......@@ -349,6 +312,7 @@ class AudioHomeActivity :
super.onConnectionStateChanged(state, reason)
// 3 网络连接被服务器中止 该情况现在是因为后端踢人逻辑
if (reason == 3) {
callEventSave( "60", "通话结束:网络连接被服务器中止 该情况现在是因为后端踢人逻辑,原因(${reason}")
writeAgoraLog("通话结束:网络连接被服务器中止 该情况现在是因为后端踢人逻辑,原因(${reason})")
AliYunRichLogsHelper.getInstance()
.sendRichLog(
......@@ -365,6 +329,8 @@ class AudioHomeActivity :
override fun onLeaveChannel(stats: IRtcEngineEventHandler.RtcStats?) {
super.onLeaveChannel(stats)
callEventSave( "50", "离开频道回调stats=${stats}")
LogUtil.e("[agora]离开频道回调")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "离开频道回调")
......@@ -375,6 +341,7 @@ class AudioHomeActivity :
override fun onUserJoined(uid: Int, elapsed: Int) {
super.onUserJoined(uid, elapsed)
callEventSave( "40", "${uid}加入频道回调")
LogUtil.e("[agora]远端用户/主播加入频道回调")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "远端用户/主播加入频道回调")
......@@ -382,6 +349,8 @@ class AudioHomeActivity :
override fun onUserOffline(uid: Int, elapsed: Int) {
super.onUserOffline(uid, elapsed)
callEventSave( "50", "uid:${uid}离开频道回调 elapsed:${elapsed}")
LogUtil.e("[agora]远端用户$uid 离开频道回调")
writeAgoraLog("接通后通话结束:对方已挂断")
AliYunRichLogsHelper.getInstance()
......@@ -447,7 +416,7 @@ class AudioHomeActivity :
}
}
}
//
//
override fun createPresenter(): IAudioHomeActivityContract.Presenter {
return AudioHomePresenterImpl()
......@@ -464,6 +433,8 @@ class AudioHomeActivity :
initSensorManager()
//页面传递数据初始化
initIntentData()
callEventSave( "80", "通话页面打开")
writeAgoraLog("通话页面打开的时候,RTM登录状态码:${YDLavManager.sdkStatus}")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.RTM, "通话页面打开的时候,RTM登录状态码:${YDLavManager.sdkStatus}")
......@@ -522,6 +493,8 @@ class AudioHomeActivity :
listenId = intent.getStringExtra(IntentConstants.INTENT_LISTEN_ID)
commentUrl = intent.getStringExtra(IntentConstants.INTENT_COMMENT_URL)
dialStatus = intent.getStringExtra(IntentConstants.INTENT_DIALSTATUS)
callEventSave( "90", "专家的通话状态dialStatus:$dialStatus")
writeAgoraLog("专家的通话状态dialStatus:$dialStatus", false)
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "专家的通话状态dialStatus:$dialStatus")
......@@ -538,6 +511,8 @@ class AudioHomeActivity :
listenId
)
val content = Gson().toJson(logBean)
callEventSave( "80", "主叫方发送的邀请通话消息内容:$content")
writeAgoraLog("主叫方发送的邀请通话消息内容:$content", true)
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "主叫方发送的邀请通话消息内容:$content")
......@@ -547,6 +522,8 @@ class AudioHomeActivity :
}
private fun reLoginRTM() {
callEventSave( "80", "RMT状态:${YDLavManager.sdkStatus},重新登录RMT")
writeAgoraLog("RMT状态:${YDLavManager.sdkStatus},重新登录RMT")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.RTM, "RMT状态:${YDLavManager.sdkStatus},重新登录RMTt")
......@@ -607,6 +584,8 @@ class AudioHomeActivity :
return@setOnClickListener
}
if (isConnectSuccess) {
callEventSave( "50", "已接通:主叫主动挂断")
writeAgoraLog("已接通:主叫主动挂断")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "已接通:主叫主动挂断")
......@@ -660,6 +639,8 @@ class AudioHomeActivity :
.permission(com.hjq.permissions.Permission.RECORD_AUDIO)
.request(object : OnPermissionCallback {
override fun onGranted(p0: MutableList<String>?, p1: Boolean) {
callEventSave( "80", "请求音频权限通过")
writeAgoraLog("请求音频权限通过")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "请求音频权限通过")
......@@ -674,6 +655,8 @@ class AudioHomeActivity :
YDLavManager.AUDIO_NO_AUTH_ERROR_CODE,
null
)
callEventSave( "80", "拒绝请求音频权限")
writeAgoraLog("拒绝请求音频权限")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "拒绝请求音频权限")
......@@ -688,7 +671,9 @@ class AudioHomeActivity :
}
})
}catch (e:Exception ){
} catch (e: Exception) {
callEventSave( "80", "请求音频权限异常${e.message}")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "请求音频权限异常${e.message}")
init()
......@@ -740,6 +725,8 @@ class AudioHomeActivity :
}
}, {
callEventSave( "80", "倒计时异常${it.message}")
LogUtil.d(it.message)
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "倒计时异常${it.message}")
......@@ -748,6 +735,8 @@ class AudioHomeActivity :
if (!isConnectSuccess) {
//关闭音乐
stopPlaying()
callEventSave( "50", "未接通挂断:50s等待倒计时结束挂断")
writeAgoraLog("未接通挂断:50s等待倒计时结束挂断")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "未接通挂断:50s等待倒计时结束挂断")
......@@ -758,6 +747,8 @@ class AudioHomeActivity :
channelId!!,
sendDoctocrMsg!!
) { msg, code ->
callEventSave( "50", "未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断")
writeAgoraLog("未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断")
AliYunRichLogsHelper.getInstance()
.sendRichLog(
......@@ -798,6 +789,8 @@ class AudioHomeActivity :
* 声网加入频道
*/
fun joinChannel() {
callEventSave( "40", "对方(专家)接受了通话邀请,主叫(用户)开始加入频道:$channelId")
writeAgoraLog("对方(专家)接受了通话邀请,主叫(用户)开始加入频道:$channelId")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "对方(专家)接受了通话邀请,主叫(用户)开始加入频道:$channelId")
......@@ -815,6 +808,8 @@ class AudioHomeActivity :
*
*/
private fun userCloseCalling() {
callEventSave( "50", "未接听时:主叫(用户)主动挂断,取消呼叫")
writeAgoraLog("未接听时:主叫(用户)主动挂断,取消呼叫")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "未接听时:主叫(用户)主动挂断,取消呼叫")
......@@ -825,6 +820,8 @@ class AudioHomeActivity :
channelId!!,
sendDoctocrMsg!!
) { msg, code ->
callEventSave( "50", "未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断")
writeAgoraLog("未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断")
......@@ -873,6 +870,8 @@ class AudioHomeActivity :
val dialog =
AxbConfirmDialog(mContext, type, object : AxbConfirmDialog.OnClickEnsureListener {
override fun onClickEnsure() {
callEventSave( "80", "主叫点击切换AXB按钮")
writeAgoraLog("主叫点击切换AXB按钮")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "主叫点击切换AXB按钮")
......@@ -897,6 +896,8 @@ class AudioHomeActivity :
if (isConnectSuccess) {
uploadException("", "zhu", "108", object : YDLavManager.UploadExceptionCallback {
override fun onSuccess() {
callEventSave( "80", "离开房间成功,主叫切换AXB之后")
writeAgoraLog("离开房间成功,主叫切换AXB之后")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "离开房间成功,主叫切换AXB之后")
......@@ -932,6 +933,8 @@ class AudioHomeActivity :
channelId!!,
sendDoctocrMsg!!
) { msg, code ->
callEventSave( "80", "未接听时:主叫主动挂断失败,msg=$msg($code),再次挂断")
writeAgoraLog("未接听时:主叫主动挂断失败,msg=$msg($code),再次挂断")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "未接听时:主叫主动挂断失败,msg=$msg($code),再次挂断")
......@@ -1094,6 +1097,8 @@ class AudioHomeActivity :
}, {
LogUtil.d(it.message)
}, {
callEventSave( "60", "倾诉时间已用完")
YDLavManager.instances.callEndStatusUpdate(channelId!!, 3, "倾诉时间已用完")
//注意:自动挂断时,如果对方离开频道的回调已经触发,就不要再重复调用接口
showToast("通话已结束")
......@@ -1366,4 +1371,24 @@ class AudioHomeActivity :
//重写物理返回按钮
override fun onBackPressed() {
}
/**
* 倾诉日志
* @param session 通话业务id
* @param status 状态:01通话中(不影响通话的事件) 10:拨打 20未拨通 30未接通 40 接通 50挂断 60断线 70重连 80 呼叫方信号 90 被呼叫方信号
* @param res 上报的详细
* @param line 载体:1.网易 2.中国移动(双呼)3.联通 4.华为 5.糖猫-联通 7:声网 8:微信 10:新移动
* */
private fun callEventSave(
status: String,
res: String,
session: String? = channelId,
line: String = "7"
) {
AudioApiRequestUtil.callEventSave(session, line, status, res)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
}
}
......@@ -12,6 +12,7 @@ import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.utils.NetworkParamsUtils
import com.ydl.ydlcommon.utils.TimeUtil
import com.ydl.ydlnet.YDLHttpUtils
import io.reactivex.Observable
import okhttp3.MediaType
......@@ -100,5 +101,13 @@ class AudioApiRequestUtil {
fun callEndStatusUpdate(channelId: String, endStatus: Int, msg: String): Observable<BaseAPIResponse<Any>> {
return YDLHttpUtils.obtainApi(AudioNetAPi::class.java).callEndStatusUpdate(channelId, endStatus, msg)
}
fun callEventSave( session: String?,
line: String,
status: String,
reponse: String): Observable<BaseAPIResponse<Any>> {
var eventTime = TimeUtil.getNowDatetime()
return YDLHttpUtils.obtainApi(AudioNetAPi::class.java).callEventSave(session,eventTime,line,status,reponse)
}
}
}
\ No newline at end of file
......@@ -73,4 +73,14 @@ interface AudioNetAPi {
@Headers( YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun callEndStatusUpdate(@Query("channelId") channelId:String,@Query("endStatus") endStatus:Int,@Query("msg") msg:String): Observable<BaseAPIResponse<Any>>
//倾诉事件上报接口
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA, "Content-Type:application/json")
@POST("call/v1/event/save")
fun callEventSave(
@Query("session") session: String?,
@Query("eventTime") eventTime: String,
@Query("line") line: String,
@Query("status") status: String,
@Query("reponse") reponse: String
): Observable<BaseAPIResponse<Any>>
}
\ No newline at end of file
......@@ -13,10 +13,10 @@ import android.hardware.SensorManager
import android.net.Uri
import android.os.PowerManager
import android.provider.Settings
import androidx.core.content.ContextCompat
import android.text.TextUtils
import android.view.View
import android.view.animation.AccelerateInterpolator
import androidx.core.content.ContextCompat
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.google.gson.Gson
......@@ -24,6 +24,7 @@ import com.tbruyelle.rxpermissions2.RxPermissions
import com.ydl.audioim.BuildConfig
import com.ydl.audioim.R
import com.ydl.audioim.YDLavManager
import com.ydl.audioim.http.AudioApiRequestUtil
import com.ydl.audioim.http.command.ConnectExceptionCommand
import com.ydl.audioim.http.command.PayLoad
import com.ydl.audioim.player.AudioPlayer
......@@ -130,6 +131,7 @@ class ConsultantAudioHomeActivity :
* @param muted 该用户是否静音:true: 该用户已静音音频 false: 该用户已取消音频静音
*/
override fun onUserMuteAudio(uid: Int, muted: Boolean) {
callEventSave("80", "uid:${uid} 开启了静音 = ${muted}")
// runOnUiThread {
// showToast("对方静音了,提醒他打开!")
// }
......@@ -137,9 +139,12 @@ class ConsultantAudioHomeActivity :
override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) {
super.onJoinChannelSuccess(channel, uid, elapsed)
callEventSave("40", "uid:${uid} 加入声网($channel)频道成功")
LogUtil.e("[agora]$uid 加入频道回调")
writeAgoraLog("被叫(用户)加入声网($channel)频道成功")
AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.AGORA, "被叫(用户)加入声网($channel)频道成功")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "被叫(用户)加入声网($channel)频道成功")
runOnUiThread {
// 加入频道后再通知用户已接受
// YDLRTMClient.instances.acceptCall(mAudioMessageBean?.channelId)
......@@ -165,6 +170,8 @@ class ConsultantAudioHomeActivity :
*/
override fun onRejoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) {
super.onRejoinChannelSuccess(channel, uid, elapsed)
callEventSave("70", "uid:${uid} 被叫(用户${uid})重新加入声网频道($channel)成功")
LogUtil.e("[agora]$uid 重新加入频道回调")
writeAgoraLog("被叫(用户)重新加入声网频道($channel)成功")
AliYunRichLogsHelper.getInstance()
......@@ -185,6 +192,8 @@ class ConsultantAudioHomeActivity :
override fun onUserJoined(uid: Int, elapsed: Int) {
super.onUserJoined(uid, elapsed)
callEventSave("80", "uid:${uid} 主叫(专家)加入声网频道成功")
LogUtil.e("[agora]远端用户加入频道回调")
writeAgoraLog("主叫(专家)加入声网频道成功")
AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.AGORA, "主叫(专家)加入声网频道成功")
......@@ -207,6 +216,8 @@ class ConsultantAudioHomeActivity :
super.onConnectionStateChanged(state, reason)
// 3 网络连接被服务器中止 该情况现在是因为后端踢人逻辑
if (reason == 3) {
callEventSave("50", "通话挂断:网络连接被服务器(后端)中止")
showToast("对方已挂断")
YDLavManager.instances.callEndStatusUpdate(
mAudioMessageBean?.channelId!!,
......@@ -229,6 +240,8 @@ class ConsultantAudioHomeActivity :
*/
override fun onLeaveChannel(stats: IRtcEngineEventHandler.RtcStats?) {
super.onLeaveChannel(stats)
callEventSave("50", "自己离开频道回调")
LogUtil.e("[agora]自己离开频道回调")
AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.AGORA, "自己离开频道回调")
......@@ -250,6 +263,21 @@ class ConsultantAudioHomeActivity :
override fun onUserOffline(uid: Int, elapsed: Int) {
super.onUserOffline(uid, elapsed)
LogUtil.e("[agora]$uid 主播离开频道回调")
when (elapsed) {
0 -> {
callEventSave("50", "用户主动离开")
}
1 -> {
callEventSave(
"60",
"因过长时间收不到对方数据包,超时掉线。注意:由于 SDK 使用的是不可靠通道,也有可能对方主动离开本方没收到对方离开消息而误判为超时掉线"
)
}
2 -> {
callEventSave("60", "用户身份从主播切换为观众(直播模式下)")
}
}
runOnUiThread {
YDLavManager.instances.callEndStatusUpdate(
mAudioMessageBean?.channelId!!,
......@@ -258,7 +286,8 @@ class ConsultantAudioHomeActivity :
)
showToast("对方已挂断")
writeAgoraLog("通话接通后挂断:主叫(专家)离开频道")
AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.AGORA, "通话接通后挂断:主叫(专家)离开频道")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "通话接通后挂断:主叫(专家)离开频道")
if (null != totalDisposable) {
totalDisposable!!.dispose()
......@@ -303,7 +332,8 @@ class ConsultantAudioHomeActivity :
uploadException("mRtcEventHandler-onError:errorCode--%${err}")
LogUtil.e("[agora] 发生错误回调 =$err")
writeAgoraLog("声网错误回调errorCode--%${err}")
AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.AGORA, "声网错误回调errorCode--%${err}")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "声网错误回调errorCode--%${err}")
//3:SDK 初始化失败。Agora 建议尝试以下处理方法
//7:SDK 尚未初始化,就调用其 API。请确认在调用 API 之前已创建 RtcEngine 对象并完成初始化
......@@ -321,20 +351,31 @@ class ConsultantAudioHomeActivity :
3, 7, 109, 110 -> {
showToast("请退出应用,重新打开")
close(RESULT_NOT_ANSWERED_CODE, "咨询师已挂断")
callEventSave(
"30",
"err:${err} 3:SDK 初始化失败|7:SDK 尚未初始化|109:当前使用的 Token 过期|110:生成的 Token 无效"
)
}
10 -> {
callEventSave("30", "err:${err} 专家网络较差")
showToast("当前网络较差,请更换网络")
close(RESULT_NOT_ANSWERED_CODE, "专家网络较差")
}
101 -> {
callEventSave("30", "err:${err} 不是有效的 APP ID")
showToast("安装包有问题,请联系技术")
close(RESULT_NOT_ANSWERED_CODE, "安装包有问题,请联系技术")
}
102 -> {
callEventSave("30", "err:${err} 不是有效的 频道名")
showToast("频道错误,请联系技术")
close(RESULT_NOT_ANSWERED_CODE, "频道错误,请联系技术")
}
123 -> {
callEventSave("30", "err:${err}此用户被服务器禁止")
// showToast("对方不允许接听电话,请联系客服")
// close(RESULT_NOT_ANSWERED_CODE, "该专家不允许接听电话,请联系客服")
}
......@@ -348,11 +389,13 @@ class ConsultantAudioHomeActivity :
)
}
}
//本地音频状态监听
override fun onLocalAudioStateChanged(localVideoState: Int, error: Int) {
super.onLocalAudioStateChanged(localVideoState, error)
writeAgoraLog("本地音频回调$error")
}
override fun onNetworkQuality(uid: Int, txQuality: Int, rxQuality: Int) {
super.onNetworkQuality(uid, txQuality, rxQuality)
var status = -1
......@@ -444,6 +487,8 @@ class ConsultantAudioHomeActivity :
mAudioMessageBean = Gson().fromJson(json, AudioMessageBean::class.java)
if (YDLavManager.sdkStatus != Constants.CONNECTION_STATE_CONNECTED) {
callEventSave("90", "RMT状态:${YDLavManager.sdkStatus},重新登录RMT")
writeAgoraLog("RMT状态:${YDLavManager.sdkStatus},重新登录RMT")
val uid =
ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid
......@@ -457,6 +502,8 @@ class ConsultantAudioHomeActivity :
}
}
} else {
callEventSave("90", "通话异常")
close(RESULT_NOT_ANSWERED_CODE, "通话异常")
return
}
......@@ -497,6 +544,8 @@ class ConsultantAudioHomeActivity :
}
tv_name.text = userName
writeAgoraLog("用户接收电话界面开启")
callEventSave("90", "用户接收电话界面开启")
}
private fun initData() {
......@@ -527,6 +576,8 @@ class ConsultantAudioHomeActivity :
override fun channelTokenResponse(token: String?, needJoinChannel: Boolean) {
if (TextUtils.isEmpty(token)) {
callEventSave("90", "通话频道不存在")
LogUtil.e("[agora]token not null")
AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.AGORA, "token isEmpty ")
......@@ -560,9 +611,15 @@ class ConsultantAudioHomeActivity :
rxPermissions.requestEach(Manifest.permission.RECORD_AUDIO).subscribe { permission ->
when {
//权限已申请 进行初始化操作
permission.granted -> init()
permission.granted -> {
init()
callEventSave("90", "申请音频权限成功")
}
//权限为申请 重新申请
permission.shouldShowRequestPermissionRationale -> requestPermission()
permission.shouldShowRequestPermissionRationale -> {
requestPermission()
callEventSave("90", "权限 重新申请")
}
//跳转设置界面
else -> {
ToastHelper.show(getString(R.string.audioim_need_storage_permission_hint))
......@@ -602,8 +659,11 @@ class ConsultantAudioHomeActivity :
private fun joinChannel() {
val account = YdlCommonRouterManager.getYdlCommonRoute().getUid()
if (!TextUtils.isEmpty(mAudioMessageBean?.channelId)) {
callEventSave("40", "加入频道joinChannel:$account")
LogUtil.e("[agora] joinChannel:$account")
AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.AGORA, "joinChannel:$account")
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "joinChannel:$account")
voiceManage?.getVoiceApi()?.joinChannel(
channelToken
......@@ -613,6 +673,8 @@ class ConsultantAudioHomeActivity :
}
override fun executeFinish() {
callEventSave("50", "对方已挂断")
showToast("对方已挂断")
close(RESULT_ANSWERED_CODE, "")
}
......@@ -645,10 +707,14 @@ class ConsultantAudioHomeActivity :
private fun showStopService() {
if (status == STATUS_NOT_ANSWERED) {
YDLavManager.instances.callEndStatusUpdate(mAudioMessageBean?.channelId!!, 2, "被叫主动拒绝")
callEventSave("30", "通话未接通挂断:用户主动挂断")
writeAgoraLog("通话未接通挂断:用户主动挂断")
//当未接听 直接挂断 要发送给老师一条消息
close(RESULT_NOT_ANSWERED_CODE, "用户已挂断")
} else if (status == STATUS_ANSWERED) {
callEventSave("50", "通话接通后挂断:专家主动挂断")
YDLavManager.instances.callEndStatusUpdate(mAudioMessageBean?.channelId!!, 3, "被叫主动拒绝")
writeAgoraLog("通话接通后挂断:专家主动挂断")
//正常接听 挂断电话 需要重置信令管理类状态
......@@ -668,6 +734,8 @@ class ConsultantAudioHomeActivity :
return
}
showStopService()
callEventSave("50", "用户点击挂断按钮")
writeAgoraLog("用户点击挂断按钮")
ActionCountUtils.count(
"shengwang_popup_layer_page|shengwang_popup_layer_refuse_click",
......@@ -691,6 +759,7 @@ class ConsultantAudioHomeActivity :
// ?: "")
executeCall(true)
callEventSave("90", "用户点击接听按钮")
ActionCountUtils.count(
......@@ -708,6 +777,8 @@ class ConsultantAudioHomeActivity :
//停止震动
VibratorUtil.StopVibrate(this)
if (!canExcute) {
callEventSave("80", "对方已挂断")
showToast("对方已挂断")
finish()
} else {
......@@ -1026,4 +1097,24 @@ class ConsultantAudioHomeActivity :
}
super.onDestroy()
}
/**
* 倾诉日志
* @param session 通话业务id
* @param status 状态:01通话中(不影响通话的事件) 10:拨打 20未拨通 30未接通 40 接通 50挂断 60断线 70重连 80 呼叫方信号 90 被呼叫方信号
* @param res 上报的详细
* @param line 载体:1.网易 2.中国移动(双呼)3.联通 4.华为 5.糖猫-联通 7:声网 8:微信 10:新移动
* */
private fun callEventSave(
status: String,
res: String,
session: String? = channelToken,
line: String = "7"
) {
AudioApiRequestUtil.callEventSave(session, line, status, res)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
}
}
......@@ -15,19 +15,22 @@ import retrofit2.http.*
* @Company 壹点灵
* @date 2018/8/10
*/
interface ConfideHomeApi{
interface ConfideHomeApi {
//倾诉首页
@Headers( YDL_DOMAIN + YDL_DOMAIN_JAVA,"Content-Type:application/json")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA, "Content-Type:application/json")
@GET
fun confideHome(@Url url: String,@Query("cateSource") cateSource:Int): Observable<BaseAPIResponse<MutableList<ConfideHomeDataBean>>>
fun confideHome(
@Url url: String,
@Query("cateSource") cateSource: Int
): Observable<BaseAPIResponse<MutableList<ConfideHomeDataBean>>>
//每日精选 换一批
@Headers( YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA, "Content-Type:application/json")
@GET
fun recommedChange(@Url url: String): Observable<BaseAPIResponse<ConfideHomeDataBean>>
//连接-java接口
@Headers( YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA, "Content-Type:application/json")
@GET("auth/listen/dial")
fun connectJava(@QueryMap params: Map<String, String>): Observable<BaseAPIResponse<ConfideConnectResponse>>
}
\ No newline at end of file
......@@ -16,7 +16,7 @@ import io.reactivex.Observable
* @Company 壹点灵
* @date 2018/7/26
*/
class ConfideHomeHttpImpl private constructor(): IConfideHomeHttp{
class ConfideHomeHttpImpl private constructor() : IConfideHomeHttp {
companion object {
fun getInstance(): ConfideHomeHttpImpl {
......@@ -34,40 +34,39 @@ class ConfideHomeHttpImpl private constructor(): IConfideHomeHttp{
override fun confideHomeRequest(): Observable<BaseAPIResponse<MutableList<ConfideHomeDataBean>>> {
return RxUtils.mapObservable(ConfideHomeParam(0))
.flatMap {
confideHomeApi.confideHome(HttpConfig.JAVA_BASE_URL+"auth/listen/home",2)
}
.flatMap {
confideHomeApi.confideHome(HttpConfig.JAVA_BASE_URL + "auth/listen/home", 2)
}
}
override fun recommendList(param : ConfideRecommendParam): Observable<BaseAPIResponse<ConfideHomeDataBean>> {
override fun recommendList(param: ConfideRecommendParam): Observable<BaseAPIResponse<ConfideHomeDataBean>> {
val inUid = StringBuffer()
for (i in param.notInUid.indices) {
inUid.append(param.notInUid[i])
if(i<param.notInUid.size-1){
if (i < param.notInUid.size - 1) {
inUid.append(",")
}
}
val sb = StringBuffer()
sb.append("page").append("=").append(param.page).append("&")
.append("sortType").append("=").append(param.getSortType()).append("&")
.append("sexType").append("=").append(param.getSexType()).append("&")
.append("ageType").append("=").append(param.getAgeType()).append("&")
.append("goodType").append("=").append(param.getGoodType()).append("&")
.append("notInUid").append("=").append(inUid.toString()).append("&")
.append("sortType").append("=").append(param.getSortType()).append("&")
.append("sexType").append("=").append(param.getSexType()).append("&")
.append("ageType").append("=").append(param.getAgeType()).append("&")
.append("goodType").append("=").append(param.getGoodType()).append("&")
.append("notInUid").append("=").append(inUid.toString()).append("&")
val confideParam = sb.toString()
return RxUtils.mapObservable(param)
.flatMap {
confideHomeApi.recommedChange(HttpConfig.JAVA_BASE_URL + "auth/listen/nsearch?"+confideParam)
}
.flatMap {
confideHomeApi.recommedChange(HttpConfig.JAVA_BASE_URL + "auth/listen/nsearch?" + confideParam)
}
}
override fun connectionJava(connectParam: ConnectParamJava): Observable<BaseAPIResponse<ConfideConnectResponse>> {
return RxUtils.mapObservable(connectParam)
.flatMap {
it->
YDLHttpUtils.obtainApi(ConfideHomeApi::class.java).connectJava(it)
}
.flatMap { it ->
YDLHttpUtils.obtainApi(ConfideHomeApi::class.java).connectJava(it)
}
}
}
\ No newline at end of file
......@@ -13,7 +13,7 @@ import io.reactivex.Observable
* @Company 壹点灵
* @date 2018/7/26
*/
interface IConfideHomeHttp{
interface IConfideHomeHttp {
/**
* 倾诉首页请求
*/
......@@ -22,8 +22,8 @@ interface IConfideHomeHttp{
/**
* 为你推荐列表
*/
fun recommendList(param : ConfideRecommendParam): Observable<BaseAPIResponse<ConfideHomeDataBean>>
fun recommendList(param: ConfideRecommendParam): Observable<BaseAPIResponse<ConfideHomeDataBean>>
//倾诉链接,java接口,支持axb和声网
fun connectionJava(connectParam: ConnectParamJava) : Observable<BaseAPIResponse<ConfideConnectResponse>>
fun connectionJava(connectParam: ConnectParamJava): Observable<BaseAPIResponse<ConfideConnectResponse>>
}
\ No newline at end of file
......@@ -13,15 +13,12 @@ import com.ydl.audioim.widget.AxbConfirmDialog
import com.ydl.confide.home.bean.ConnectParamJava
import com.ydl.confide.home.constants.FinalString
import com.ydl.confide.home.http.ConfideHomeDataManager
import com.ydl.confide.home.util.ConfideNetworkUtil
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.webview.TellData
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.dialog.CommonDialog
import com.yidianling.common.tools.RxSPTool
import com.yidianling.common.tools.ToastUtil
import com.yidianling.user.api.service.IUserService
import com.yidianling.ydl_pay.pay.payDialog.CallBack
......@@ -111,7 +108,7 @@ class ConfideWebServiceImpl {
if (it.data?.dialDetail?.callConnectType ?: -1 == 3) {
//声网
it.data?.dialDetail?.agoraExpertInfo ?: return@subscribe
if (!YDLavManager.isOnlineRtm){ // 判断如果账号在其它设备登录rtm是否在线
if (!YDLavManager.isOnlineRtm) { // 判断如果账号在其它设备登录rtm是否在线
ToastUtil.toastShort("网络通话错误代码001")
return@subscribe
}
......@@ -170,43 +167,41 @@ class ConfideWebServiceImpl {
isShowAXB: Boolean,
dialStatus: String
) {
if (expertInfo.listenerStatus != 1) {
ToastHelper.show("老师正在通话中,请稍后重试")
return
}
if (TextUtils.isEmpty(expertInfo.channelId)) {
ToastHelper.show("服务端返回参数异常,请刷新页面后重试")
return
}
if (expertInfo.remainingTime?.remainingTime == null) {
expertInfo.remainingTime =
ExpertInfoBean.ListenRemainingTime(expertInfo.totalDuration);
}
ARouter.getInstance().build("/av/AudioHomeActivity")
.withString(IntentConstants.INTENT_EXPERT_HEAD_URL, expertInfo.expertHeadUrl)
.withString(IntentConstants.INTENT_EXPERT_NAME, expertInfo.expertName)
.withString(IntentConstants.INTENT_EXPERT_TIPS, expertInfo.expertTips)
.withString(IntentConstants.INTENT_ROOM_ID, expertInfo.channelId)
.withString(
IntentConstants.INTENT_REMAIN_TIME,
expertInfo.remainingTime.remainingTime
)
.withString(IntentConstants.INTENT_CALL_ID, call_id)
.withString(IntentConstants.INTENT_RELATION_ID, "${relation_id}")
.withString(IntentConstants.INTENT_TOKEN, expertInfo.token)
.withString(IntentConstants.INTENT_SIGNAL_TOKEN, expertInfo.signalToken)
.withString(IntentConstants.INTENT_LISTENER_UID, expertInfo.listenerUid)
.withString(IntentConstants.INTENT_TOTAL_DURATION, expertInfo.totalDuration)
.withString(IntentConstants.INTENT_COMMENT_URL, expertInfo.commentUrl)
.withString(IntentConstants.INTENT_LISTEN_ID, confideId.toString())
.withString(IntentConstants.INTENT_DIALSTATUS, dialStatus)
.withBoolean(IntentConstants.INTENT_ISSHOWAXB, isShowAXB)
.navigation(activity)
if (expertInfo.listenerStatus != 1) {
ToastHelper.show("老师正在通话中,请稍后重试")
return
}
if (TextUtils.isEmpty(expertInfo.channelId)) {
ToastHelper.show("服务端返回参数异常,请刷新页面后重试")
return
}
if (expertInfo.remainingTime?.remainingTime == null) {
expertInfo.remainingTime =
ExpertInfoBean.ListenRemainingTime(expertInfo.totalDuration);
}
ARouter.getInstance().build("/av/AudioHomeActivity")
.withString(IntentConstants.INTENT_EXPERT_HEAD_URL, expertInfo.expertHeadUrl)
.withString(IntentConstants.INTENT_EXPERT_NAME, expertInfo.expertName)
.withString(IntentConstants.INTENT_EXPERT_TIPS, expertInfo.expertTips)
.withString(IntentConstants.INTENT_ROOM_ID, expertInfo.channelId)
.withString(
IntentConstants.INTENT_REMAIN_TIME,
expertInfo.remainingTime.remainingTime
)
.withString(IntentConstants.INTENT_CALL_ID, call_id)
.withString(IntentConstants.INTENT_RELATION_ID, "${relation_id}")
.withString(IntentConstants.INTENT_TOKEN, expertInfo.token)
.withString(IntentConstants.INTENT_SIGNAL_TOKEN, expertInfo.signalToken)
.withString(IntentConstants.INTENT_LISTENER_UID, expertInfo.listenerUid)
.withString(IntentConstants.INTENT_TOTAL_DURATION, expertInfo.totalDuration)
.withString(IntentConstants.INTENT_COMMENT_URL, expertInfo.commentUrl)
.withString(IntentConstants.INTENT_LISTEN_ID, confideId.toString())
.withString(IntentConstants.INTENT_DIALSTATUS, dialStatus)
.withBoolean(IntentConstants.INTENT_ISSHOWAXB, isShowAXB)
.navigation(activity)
}
}
......@@ -9,6 +9,10 @@ import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
/**
* @author liupeng
* 日期转换工具
*/
public class TimeUtil {
public static boolean isEarly(int days, long time) {
......@@ -235,15 +239,12 @@ public class TimeUtil {
cal2.setTime(date2);
int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
if (0 == subYear) {
if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
return true;
return cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR);
} else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
// 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
return true;
return cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR);
} else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
return true;
return cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR);
}
return false;
}
......@@ -262,17 +263,18 @@ public class TimeUtil {
int hour = 0;
int minute = 0;
int second = 0;
if (time <= 0)
if (time <= 0) {
return "00:00";
else {
} else {
minute = time / 60;
if (minute < 60) {
second = time % 60;
timeStr = unitFormat(minute) + ":" + unitFormat(second);
} else {
hour = minute / 60;
if (hour > 99)
if (hour > 99) {
return "99:59:59";
}
minute = minute % 60;
second = time - hour * 3600 - minute * 60;
timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":" + unitFormat(second);
......@@ -283,17 +285,20 @@ public class TimeUtil {
public static String unitFormat(int i) {
String retStr = null;
if (i >= 0 && i < 10)
if (i >= 0 && i < 10) {
retStr = "0" + Integer.toString(i);
else retStr = "" + i;
} else {
retStr = "" + i;
}
return retStr;
}
public static String getElapseTimeForShow(int milliseconds) {
StringBuilder sb = new StringBuilder();
int seconds = milliseconds / 1000;
if (seconds < 1)
if (seconds < 1) {
seconds = 1;
}
int hour = seconds / (60 * 60);
if (hour != 0) {
sb.append(hour).append("小时");
......
package com.ydl.ydlcommon.utils;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
/**
* @author liupeng
* 日期转换工具
*/
public class TimeUtil {
public static boolean isEarly(int days, long time) {
return (currentTimeMillis() - time) > (days * 24 * 3600 * 1000);
}
public static int currentTimeSecond() {
return (int) (System.currentTimeMillis() / 1000);
}
public static long currentTimeMillis() {
return System.currentTimeMillis();
}
public static long[] getTsTimes() {
long[] times = new long[2];
Calendar calendar = Calendar.getInstance();
times[0] = calendar.getTimeInMillis() / 1000;
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
times[1] = calendar.getTimeInMillis() / 1000;
return times;
}
public static String getFormatDatetime(int year, int month, int day) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.format(new GregorianCalendar(year, month, day).getTime());
}
public static Date getDateFromFormatString(String formatDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(formatDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
public static String getNowDatetime() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
return (formatter.format(new Date()));
}
public static int getNow() {
return (int) ((new Date()).getTime() / 1000);
}
public static String getNowDateTime(String format) {
Date date = new Date();
SimpleDateFormat df = new SimpleDateFormat(format, Locale.getDefault());
return df.format(date);
}
public static String getDateString(long milliseconds) {
return getDateTimeString(milliseconds, "yyyyMMdd");
}
public static String getTimeString(long milliseconds) {
return getDateTimeString(milliseconds, "HHmmss");
}
public static String getBeijingNowTimeString(String format) {
TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");
Date date = new Date(currentTimeMillis());
SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.getDefault());
formatter.setTimeZone(timezone);
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTimeZone(timezone);
String prefix = gregorianCalendar.get(Calendar.AM_PM) == Calendar.AM ? "上午" : "下午";
return prefix + formatter.format(date);
}
public static String getBeijingNowTime(String format) {
TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");
Date date = new Date(currentTimeMillis());
SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.getDefault());
formatter.setTimeZone(timezone);
return formatter.format(date);
}
public static String getDateTimeString(long milliseconds, String format) {
Date date = new Date(milliseconds);
SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.getDefault());
return formatter.format(date);
}
public static String getFavoriteCollectTime(long milliseconds) {
String showDataString = "";
Date today = new Date();
Date date = new Date(milliseconds);
Date firstDateThisYear = new Date(today.getYear(), 0, 0);
if (!date.before(firstDateThisYear)) {
SimpleDateFormat dateformatter = new SimpleDateFormat("MM-dd", Locale.getDefault());
showDataString = dateformatter.format(date);
} else {
SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
showDataString = dateformatter.format(date);
}
return showDataString;
}
public static String getTimeShowString(long milliseconds, boolean abbreviate) {
String dataString;
String timeStringBy24;
Date currentTime = new Date(milliseconds);
Date today = new Date();
Calendar todayStart = Calendar.getInstance();
todayStart.set(Calendar.HOUR_OF_DAY, 0);
todayStart.set(Calendar.MINUTE, 0);
todayStart.set(Calendar.SECOND, 0);
todayStart.set(Calendar.MILLISECOND, 0);
Date todaybegin = todayStart.getTime();
Date yesterdaybegin = new Date(todaybegin.getTime() - 3600 * 24 * 1000);
Date preyesterday = new Date(yesterdaybegin.getTime() - 3600 * 24 * 1000);
if (!currentTime.before(todaybegin)) {
dataString = "今天";
} else if (!currentTime.before(yesterdaybegin)) {
dataString = "昨天";
} else if (!currentTime.before(preyesterday)) {
dataString = "前天";
} else if (isSameWeekDates(currentTime, today)) {
dataString = getWeekOfDate(currentTime);
} else {
SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
dataString = dateformatter.format(currentTime);
}
SimpleDateFormat timeformatter24 = new SimpleDateFormat("HH:mm", Locale.getDefault());
timeStringBy24 = timeformatter24.format(currentTime);
if (abbreviate) {
if (!currentTime.before(todaybegin)) {
return getTodayTimeBucket(currentTime);
} else {
return dataString;
}
} else {
return dataString + " " + timeStringBy24;
}
}
/**
* 根据不同时间段,显示不同时间
*
* @param date
* @return
*/
public static String getTodayTimeBucket(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
SimpleDateFormat timeformatter0to11 = new SimpleDateFormat("KK:mm", Locale.getDefault());
SimpleDateFormat timeformatter1to12 = new SimpleDateFormat("hh:mm", Locale.getDefault());
int hour = calendar.get(Calendar.HOUR_OF_DAY);
if (hour >= 0 && hour < 5) {
return "凌晨 " + timeformatter0to11.format(date);
} else if (hour >= 5 && hour < 12) {
return "上午 " + timeformatter0to11.format(date);
} else if (hour >= 12 && hour < 18) {
return "下午 " + timeformatter1to12.format(date);
} else if (hour >= 18 && hour < 24) {
return "晚上 " + timeformatter1to12.format(date);
}
return "";
}
/**
* 根据日期获得星期
*
* @param date
* @return
*/
public static String getWeekOfDate(Date date) {
String[] weekDaysName = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
// String[] weekDaysCode = { "0", "1", "2", "3", "4", "5", "6" };
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int intWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
return weekDaysName[intWeek];
}
public static boolean isSameDay(long time1, long time2) {
return isSameDay(new Date(time1), new Date(time2));
}
public static boolean isSameDay(Date date1, Date date2) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
return sameDay;
}
/**
* 判断两个日期是否在同一周
*
* @param date1
* @param date2
* @return
*/
public static boolean isSameWeekDates(Date date1, Date date2) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
if (0 == subYear) {
return cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR);
} else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
// 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
return cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR);
} else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
return cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR);
}
return false;
}
public static long getSecondsByMilliseconds(long milliseconds) {
long seconds = new BigDecimal((float) ((float) milliseconds / (float) 1000)).setScale(0,
BigDecimal.ROUND_HALF_UP).intValue();
// if (seconds == 0) {
// seconds = 1;
// }
return seconds;
}
public static String secToTime(int time) {
String timeStr = null;
int hour = 0;
int minute = 0;
int second = 0;
if (time <= 0) {
return "00:00";
} else {
minute = time / 60;
if (minute < 60) {
second = time % 60;
timeStr = unitFormat(minute) + ":" + unitFormat(second);
} else {
hour = minute / 60;
if (hour > 99) {
return "99:59:59";
}
minute = minute % 60;
second = time - hour * 3600 - minute * 60;
timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":" + unitFormat(second);
}
}
return timeStr;
}
public static String unitFormat(int i) {
String retStr = null;
if (i >= 0 && i < 10) {
retStr = "0" + Integer.toString(i);
} else {
retStr = "" + i;
}
return retStr;
}
public static String getElapseTimeForShow(int milliseconds) {
StringBuilder sb = new StringBuilder();
int seconds = milliseconds / 1000;
if (seconds < 1) {
seconds = 1;
}
int hour = seconds / (60 * 60);
if (hour != 0) {
sb.append(hour).append("小时");
}
int minute = (seconds - 60 * 60 * hour) / 60;
if (minute != 0) {
sb.append(minute).append("分");
}
int second = (seconds - 60 * 60 * hour - 60 * minute);
if (second != 0) {
sb.append(second).append("秒");
}
return sb.toString();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment