【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中利用消息推送實(shí)現(xiàn)類似微信視頻接聽_第1頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中利用消息推送實(shí)現(xiàn)類似微信視頻接聽_第2頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中利用消息推送實(shí)現(xiàn)類似微信視頻接聽_第3頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中利用消息推送實(shí)現(xiàn)類似微信視頻接聽_第4頁(yè)
【移動(dòng)應(yīng)用開發(fā)技術(shù)】怎么在Android中利用消息推送實(shí)現(xiàn)類似微信視頻接聽_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論