




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中利用消息推送實(shí)現(xiàn)類似微信視頻接聽
本篇文章為大家展示了怎么在Android中利用消息推送實(shí)現(xiàn)類似微信視頻接聽,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。1、背景需求:業(yè)務(wù)需要接入視頻審核功能,在PC端發(fā)起視頻通話,移動(dòng)端顯示通話界面點(diǎn)擊接聽后進(jìn)行1對(duì)1視頻通話。2、解決方案:因?yàn)轫?xiàng)目沒有IM功能。只集成了極光消息推送(極光消息推送接入?yún)⒖脊俜轿臋n,經(jīng)過(guò)跟需求溝通,采用消息推送調(diào)起通話接聽界面。再集成騰訊實(shí)時(shí)音視頻SDK(具體集成方式參考官方文檔)。最終實(shí)現(xiàn)類似微信1對(duì)1通話功能。3、技術(shù)實(shí)現(xiàn):A:編寫一個(gè)廣播接收器,并且在AndroidManifest中注冊(cè),這就是一個(gè)全局的廣播接收器。應(yīng)用退到后臺(tái)或者應(yīng)用進(jìn)程被kill,只要極光的push進(jìn)程是Live,就能接受到消息,啟動(dòng)通話接聽界面。/**
*
Created
on
2018/3/29
16:19
*
@author
baokang.jia
*
極光推送廣播接收器
*/
public
class
JiGuangPushReceiver
extends
BroadcastReceiver
{
private
static
final
String
TAG
=
"JPushReceiver";
@Override
public
void
onReceive(Context
context,
Intent
intent)
{
Bundle
bundle
=
intent.getExtras();
if
(bundle
==
null)
{
return;
}
//拿到鎖屏管理者
KeyguardManager
km
=
(KeyguardManager)
context.getSystemService(Context.KEYGUARD_SERVICE);
if
(km
!=
null
&&
km.isKeyguardLocked())
{
//為true就是鎖屏狀態(tài)下
startLoginOrCallActivity(context,bundle);
}
else
{
if
(JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction()))
{
String
regId
=
bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
LogUtil.d(TAG,
"[MyReceiver]
接收Registration
Id
:
"
+
regId);
//send
the
Registration
Id
to
yours
server...
}
else
if
(JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction()))
{
LogUtil.d(TAG,
"[MyReceiver]
接收到推送下來(lái)的自定義消息:
"
+
bundle.getString(JPushInterface.EXTRA_MESSAGE));
}
else
if
(JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction()))
{//接收到推送下來(lái)的通知
//啟動(dòng)通話界面
startLoginOrCallActivity(context,
bundle);
}
else
if
(JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction()))
{//點(diǎn)擊通知欄
//啟動(dòng)通話界面
startLoginOrCallActivity(context,
bundle);
//清除所有狀態(tài)的通知
JPushInterface.clearAllNotifications(context);
}
else
if
(JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction()))
{
LogUtil.d(TAG,
"[MyReceiver]
用戶收到到RICH
PUSH
CALLBACK:
"
+
bundle.getString(JPushInterface.EXTRA_EXTRA));
//在這里根據(jù)
JPushInterface.EXTRA_EXTRA
的內(nèi)容處理代碼,比如打開新的Activity,
打開一個(gè)網(wǎng)頁(yè)等..
}
}
}
/**
*
未登錄跳轉(zhuǎn)登錄界面,
*
else
啟動(dòng)通話接聽界面
*/
private
void
startLoginOrCallActivity(Context
context,
Bundle
bundle)
{
//EXTRA_EXTRA
String
extras
=
bundle.getString(JPushInterface.EXTRA_EXTRA);
String
userID
=
SPUtil.getString(context,
Constants.LOGIN_USER_ID);
if
(TextUtils.isEmpty(userID))
{
//啟動(dòng)登錄界面
Intent
intent
=
new
Intent(context,
LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
else
{
//啟動(dòng)通話接聽界面
int
notifyId
=
bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
if
(!TextUtils.isEmpty(extras)
&&
extras.contains("androidNotification
extras
key")){
ReceiveTalkActivity.startReceiveTalkActivity(context,
extras,notifyId);
}
}
}
}
//在AndroidManifest注冊(cè)全局自定義廣播接收器
<receiver
android:name=".event.JiGuangP`在這里插入代碼片`ushReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action
android:name="ent.REGISTRATION"
/>
<!--
Required
用戶注冊(cè)SDK的intent
-->
<action
android:name="ent.MESSAGE_RECEIVED"
/>
<!--
Required
用戶接收SDK消息的intent
-->
<action
android:name="ent.NOTIFICATION_RECEIVED"
/>
<!--
Required
用戶接收SDK通知欄信息的intent
-->
<action
android:name="ent.NOTIFICATION_OPENED"
/>
<!--
Required
用戶打開自定義通知欄的intent
-->
<action
android:name="ent.CONNECTION"
/>
<!--
接收網(wǎng)絡(luò)變化
連接/斷開
since
1.6.3
-->
<category
android:name="${PACKAGE_NAME}"
/>
</intent-filter>
</receiver>B:啟動(dòng)通話接聽界面,啟動(dòng)接聽界面后獲取當(dāng)前手機(jī)模式AudioManager
audio
=
(AudioManager)
this.getSystemService(Context.AUDIO_SERVICE);
//手機(jī)模式,振動(dòng),精英、響鈴,更具不同模式振動(dòng)或者響鈴,具體可參考以下的實(shí)現(xiàn)代碼。
//點(diǎn)擊接聽按鈕后跳轉(zhuǎn)騰訊視頻通話界面/**
*
Created
on
2019/4/28
16:19
*
@author
baokang.jia
*
視頻預(yù)審接聽界面
*/
public
class
ReceiveTalkActivity
extends
BaseActivity
{
private
static
String
PUSH_MSG_KEY
=
"push_msg_key";
private
static
String
NOTIFICATION_ID_KEY
=
"notification_id_key";
/**
*
騰訊云注冊(cè)分配的appId
*/
private
int
sdkAppId
=
/**
*
檢查運(yùn)行時(shí)權(quán)限
*/
private
boolean
mCheckPermissionResult
=
false;
private
PushMsgBean
mPushMsgBean;
/**
*
媒體播放
*/
private
MediaPlayer
mMediaPlayer;
/**
*
震動(dòng)
*/
private
Vibrator
mVibrator;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
Window
window
=
getWindow();
//懸浮窗
WindowViewUtil.setWindowFloatAndScreenOn(window,this);
super.onCreate(savedInstanceState);
//初始化倒計(jì)時(shí)器
initCountDownTimer();
//請(qǐng)求權(quán)限
requestMustPermission();
initViews();
//根據(jù)通知Id清除狀態(tài)欄對(duì)應(yīng)的通知
JPushInterface.clearAllNotifications(this);
//持續(xù)震動(dòng)和響鈴
continuedVibratorAndMediaPlayer();
}
/**
*
60秒后關(guān)閉activity
*/
private
void
initCountDownTimer()
{
long
time
=
30000;
long
countDownInterval
=
1000;
CountDownTimer
downTimer
=
new
CountDownTimer(time,
countDownInterval)
{
@Override
public
void
onTick(long
millisUntilFinished)
{
}
@Override
public
void
onFinish()
{
finish();
}
};
downTimer.start();
}
@Override
protected
int
getLayoutId()
{
return
R.layout.activity_receive_talk;
}
@Override
protected
boolean
initToolbar()
{
return
false;
}
@Override
protected
void
getIntent(Intent
intent)
{
String
pushMsg
=
getIntent().getStringExtra(PUSH_MSG_KEY);
//notificationId
=
getIntent().getIntExtra(NOTIFICATION_ID_KEY,
0);
parsePushMsg(pushMsg);
}
@Override
protected
void
initViews()
{
Button
btnCancel
=
findViewById(R.id.btn_cancel_call);
Button
btnAnswer
=
findViewById(R.id.btn_answer_call);
btnCancel.setOnClickListener(v
->{
mVibrator.cancel();
mMediaPlayer.stop();
finish();
});
btnAnswer.setOnClickListener(v
->
{
mVibrator.cancel();
mMediaPlayer.stop();
if
(mCheckPermissionResult)
{
Intent
intent
=
new
Intent(this,
TRTCMainActivity.class);
intent.putExtra("roomId",
Integer.valueOf(mPushMsgBean.getRoomId()));
intent.putExtra("userId",
mPushMsgBean.getUserId());
intent.putExtra("sdkAppId",
sdkAppId);
intent.putExtra("userSig",
mPushMsgBean.getUserSig());
startActivity(intent);
finish();
}
else
{
ToastUtil.longToast("需要的權(quán)限被拒絕,無(wú)法開啟視頻審核");
}
});
}
/**
*
持續(xù)響鈴和震動(dòng)
*/
private
void
continuedVibratorAndMediaPlayer()
{
//獲取媒體播放器
mMediaPlayer
=
new
MediaPlayer();
try
{
mMediaPlayer.setDataSource(this,
RingtoneManager
.getDefaultUri(RingtoneManager.TYPE_RINGTONE));//這里我用的通知聲音,還有其他的,大家可以點(diǎn)進(jìn)去看
mMediaPlayer.prepare();
}
catch
(IOException
e)
{
e.printStackTrace();
}
//取得震動(dòng)服務(wù)的句柄
mVibrator
=
(Vibrator)this.
getSystemService(VIBRATOR_SERVICE);
//獲取當(dāng)前手機(jī)模式
AudioManager
audio
=
(AudioManager)
this.getSystemService(Context.AUDIO_SERVICE);
if
(audio
!=
null)
{
switch
(audio.getRingerMode())
{
case
AudioManager.RINGER_MODE_SILENT://靜音
//do
sth
break;
case
AudioManager.RINGER_MODE_NORMAL://響鈴
mMediaPlayer.start();
mMediaPlayer.setLooping(true);
//循環(huán)播放
break;
case
AudioManager.RINGER_MODE_VIBRATE://震動(dòng)
//數(shù)組參數(shù)意義:第一個(gè)參數(shù)為等待指定時(shí)間后開始震動(dòng),
//震動(dòng)時(shí)間為第二個(gè)參數(shù)。后邊的參數(shù)依次為等待震動(dòng)和震動(dòng)的時(shí)間
//第二個(gè)參數(shù)為重復(fù)次數(shù),-1為不重復(fù),0為一直震動(dòng)
if
(mVibrator
!=
null)
{
mVibrator.vibrate(
new
long[]{1000,1000},0);
}
break;
}
}
}
private
void
parsePushMsg(String
pushMsg)
{
if
(!TextUtils.isEmpty(pushMsg))
{
CustomerMsg
customerMsg
=
GsonUtil.fromJson(pushMsg,
CustomerMsg.class);
String
pushMsgContent
=
customerMsg.getPushMsgContent();
pushMsgContent
=
pushMsgContent.replace("\\",
"");
LogUtil.d(Constants.LOG,"pushMsgContent="+pushMsgContent);
mPushMsgBean
=
GsonUtil.fromJson(pushMsgContent,
PushMsgBean.class);
}
}
/**
*
申請(qǐng)應(yīng)用必須的權(quán)限
*/
private
void
requestMustPermission()
{
AndPermission.with(this)
.requestCode(Constants.REQUEST_CODE_PERMISSION)
.permission(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.VIBRATE,
Manifest.permission.DISABLE_KEYGUARD,
Manifest.permission.WAKE_LOCK
)
.rationale((requestCode,
rationale)
->
//再次申請(qǐng)被拒絕的權(quán)限
AlertDialog.newBuilder(this)
.setTitle(R.string.title_dialog)
.setMessage(R.string.message_permission_failed)
.setPositiveButton(R.string.ok,
(dialog,
which)
->
{
dialog.cancel();
rationale.resume();
})
.setNegativeButton(R.string.no,
(dialog,
which)
->
{
dialog.cancel();
rationale.cancel();
}).show())
.callback(new
PermissionListener()
{
@Override
public
void
onSucceed(int
requestCode,
@NonNull
List<String>
grantPermissions)
{
mCheckPermissionResult
=
true;
}
@Override
public
void
onFailed(int
requestCode,
@NonNull
List<String>
deniedPermissions)
{
mCheckPermissionResult
=
false;
}
})
.start();
}
/**
*
界面未銷毀,啟
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 抹灰班勞務(wù)承包合同
- 房屋多人股權(quán)轉(zhuǎn)讓協(xié)議
- 自建房樓板加固施工方案
- 《高品質(zhì)住宅建設(shè)標(biāo)準(zhǔn)》編制說(shuō)明
- 五系專車專用后杠施工方案
- 鋁合金桁架腳手架施工方案
- 對(duì)開原地區(qū)玉米螟發(fā)生原因及綠色防控對(duì)策的研究分析
- 湖北省宜昌市興山縣一中2024-2025學(xué)年高三下學(xué)期入學(xué)檢測(cè)語(yǔ)文試題(原卷版+解析版)
- 碳排放交易與碳市場(chǎng)機(jī)制的策略及實(shí)施路徑
- 醫(yī)院財(cái)務(wù)知識(shí)培訓(xùn)
- 綠植花卉租賃合同
- 電子教案-《3D打印技術(shù)概論》
- JBT 11699-2013 高處作業(yè)吊籃安裝、拆卸、使用技術(shù)規(guī)程
- 2024年全國(guó)版圖知識(shí)競(jìng)賽(小學(xué)組)考試題庫(kù)大全(含答案)
- 2024年北京控股集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- DB32T 4353-2022 房屋建筑和市政基礎(chǔ)設(shè)施工程檔案資料管理規(guī)程
- [合同協(xié)議]車輛掛靠協(xié)議書
- MT_T 1175-2019 輸送瓦斯用鋼管_(高清版)
- 電子商務(wù)基礎(chǔ)與實(shí)務(wù)PPT課件
評(píng)論
0/150
提交評(píng)論