-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
androidapp之間通信(android 應(yīng)用間通信)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于androidapp之間通信的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
ChatGPT國內(nèi)免費在線使用,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、android的一個app軟件怎么實現(xiàn)實時聊天功能
這種技術(shù)叫做即時通訊,實現(xiàn)這個功能的有很多技術(shù),比如Soket、im,用這些技術(shù)都是需要自己寫后臺代碼的,如果你覺得麻煩,可以直接用一些第三方j(luò)ar包,例如融云、環(huán)信。用起來方便,也不用搞后臺。
二、android消息推送怎么實現(xiàn)?
極光推送可以輕松實現(xiàn)android消息推送。具有操作步驟如下:
1、到極光官網(wǎng)注冊賬號:https://www.jpush.cn/
2、創(chuàng)建應(yīng)用,按照要求填寫你的應(yīng)用名稱,包名提交
3、下載案例,一般情況測試是能收到信息的
4、集成到自己的項目中,按照官網(wǎng)的集成http://docs.jpush.cn/pages/viewpage.action?pageId=557214
5、集成時將注意的要點,官網(wǎng)上也有說,但是我再強調(diào)一下要注意兩個權(quán)限的包名填寫,有可能直接用案例上的拷貝到自己的manifest中時沒有替換掉包名,切記,要替換成自己的項目的包名。
極光推送已經(jīng)覆蓋了近10億Android、IOS終端,30多萬款A(yù)PP應(yīng)用,服務(wù)總用戶數(shù)超過30億,每天消息推送量達(dá)5億多條,已成為移動應(yīng)用數(shù)據(jù)平臺。極光分享幫助應(yīng)用具備國內(nèi)主流社交平臺分享功能,提供新浪微博、QQ、微信等第三方社會化分享服務(wù),提高產(chǎn)品推廣效率,幫助產(chǎn)品提高用戶體驗,獲得更多用戶。
三、android app 如何與uvc攝像頭通訊
來看看是怎么操作UVC攝像頭的吧.我們實現(xiàn)了一個專門檢測UVC攝像頭的服務(wù):UVCCameraService類,主要代碼如下:
監(jiān)聽
mUSBMonitor = new USBMonitor(this, new USBMonitor.OnDeviceConnectListener() { @Override
public void onAttach(final UsbDevice device) {
Log.v(TAG, "onAttach:" + device);
mUSBMonitor.requestPermission(device);
} @Override
public void onConnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock, final boolean createNew) {
releaseCamera(); if (BuildConfig.DEBUG) Log.v(TAG, "onConnect:"); try { final UVCCamera camera = new MyUVCCamera();
camera.open(ctrlBlock);
camera.setStatusCallback(new IStatusCallback() { // ... uvc 攝像頭鏈接成功
Toast.makeText(UVCCameraService.this, "UVCCamera connected!", Toast.LENGTH_SHORT).show(); if (device != null)
cameras.append(device.getDeviceId(), camera);
}catch (Exception ex){
ex.printStackTrace();
}
} @Override
public void onDisconnect(final UsbDevice device, final USBMonitor.UsbControlBlock ctrlBlock) { // ... uvc 攝像頭斷開鏈接
if (device != null) {
UVCCamera camera = cameras.get(device.getDeviceId()); if (mUVCCamera == camera) {
mUVCCamera = null;
Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
liveData.postValue(null);
}
cameras.remove(device.getDeviceId());
}else {
Toast.makeText(UVCCameraService.this, "UVCCamera disconnected!", Toast.LENGTH_SHORT).show();
mUVCCamera = null;
liveData.postValue(null);
}
} @Override
public void onCancel(UsbDevice usbDevice) {
releaseCamera();
} @Override
public void onDettach(final UsbDevice device) {
Log.v(TAG, "onDettach:");
releaseCamera();// AppContext.getInstance().bus.post(new UVCCameraDisconnect());
}
});123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
這個類主要實現(xiàn)UVC攝像頭的監(jiān)聽\鏈接\銷毀\反監(jiān)聽.當(dāng)有UVC攝像頭鏈接成功后,會創(chuàng)建一個mUVCCamera對象.
然后在MediaStream里, 我們改造了switchCamera,當(dāng)參數(shù)傳2時,表示要切換到UVCCamera(0,1分別表示切換到后置\前置攝像頭).
創(chuàng)建
在創(chuàng)建攝像頭時,如果是要創(chuàng)建uvc攝像頭,那直接從服務(wù)里面獲取之前創(chuàng)建的mUVCCamera實例:
if (mCameraId == 2) {
UVCCamera value = UVCCameraService.liveData.getValue(); if (value != null) { // uvc camera.
uvcCamera = value;
value.setPreviewSize(width, height,1, 30, UVCCamera.PIXEL_FORMAT_YUV420SP,1.0f); return; // value.startPreview();
}else{
Log.i(TAG, "NO UVCCamera");
uvcError = new Exception("no uvccamera connected!"); return;
} // mCameraId = 0;
}123456789101112131415
預(yù)覽
在預(yù)覽時,如果uvc攝像頭已經(jīng)創(chuàng)建了,那執(zhí)行uvc攝像頭的預(yù)覽操作:
UVCCamera value = uvcCamera;if (value != null) {
SurfaceTexture holder = mSurfaceHolderRef.get(); if (holder != null) {
value.setPreviewTexture(holder);
} try {
value.setFrameCallback(uvcFrameCallback, UVCCamera.PIXEL_FORMAT_YUV420SP/*UVCCamera.PIXEL_FORMAT_NV21*/);
value.startPreview();
cameraPreviewResolution.postValue(new int[]{width, height});
}catch (Throwable e){
uvcError = e;
}
}1234567891011121314
這里我們選的colorFormat為PIXEL_FORMAT_YUV420SP 相當(dāng)于標(biāo)準(zhǔn)攝像頭的NV21格式.
關(guān)閉預(yù)覽
同理,關(guān)閉時,調(diào)用的是uvc攝像頭的關(guān)閉.
UVCCamera value = uvcCamera; if (value != null) {
value.stopPreview();
}1234
銷毀
因為我們這里并沒有實質(zhì)性的創(chuàng)建,所以銷毀時也僅將實例置為null就可以了.
UVCCamera value = uvcCamera;if (value != null) { // value.destroy();
uvcCamera = null;
}12345
有了這些操作,我們看看上層怎么調(diào)用,
首先需要在Manifest里面增加若干代碼,具體詳見UVCCamera工程說明.如下:
<activity android:name=".UVCActivity" android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>1234567891011121314151617181920
然后,的代碼在UVCActivity里,這個類可以在library分支的myapplication工程里找到.即這里.
啟動或者停止UVC攝像頭推送:
public void onPush(View view) { // 異步獲取到MediaStream對象.
getMediaStream().subscribe(new Consumer<MediaStream>() { @Override
public void accept(final MediaStream mediaStream) throws Exception { // 判斷當(dāng)前的推送狀態(tài).
MediaStream.PushingState state = mediaStream.getPushingState(); if (state != null && state.state > 0) { // 當(dāng)前正在推送,那終止推送和預(yù)覽
mediaStream.stopStream();
mediaStream.closeCameraPreview();
}else{ // switch 0表示后置,1表示前置,2表示UVC攝像頭
// 異步開啟UVC攝像頭
RxHelper.single(mediaStream.switchCamera(2), null).subscribe(new Consumer<Object>() { @Override
public void accept(Object o) throws Exception { // 開啟成功,進(jìn)行推送.
// ...
mediaStream.startStream("cloud.easydarwin.org", "554", id);
}
}, new Consumer<Throwable>() { @Override
public void accept(final Throwable t) throws Exception { // ooop...開啟失敗,提示下...
t.printStackTrace();
runOnUiThread(new Runnable() { @Override
public void run() {
Toast.makeText(UVCActivity.this, "UVC攝像頭啟動失敗.." + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
});
}12345678910111213141516171819202122232425262728293031323334353637
這樣,整個推送就完成了.如果一切順利,應(yīng)當(dāng)能在VLC播放出來UVC攝像頭的視頻了~~
我們再看看如何錄像.也非常簡單…
public void onRecord(View view) { // 開始或結(jié)束錄像.
final TextView txt = (TextView) view;
getMediaStream().subscribe(new Consumer<MediaStream>() { @Override
public void accept(MediaStream mediaStream) throws Exception { if (mediaStream.isRecording()){ // 如果正在錄像,那停止.
mediaStream.stopRecord();
txt.setText("錄像");
}else { // 沒在錄像,開始錄像...
// 表示最大錄像時長為30秒,30秒后如果沒有停止,會生成一個新文件.依次類推...
// 文件格式為test_uvc_0.mp4,test_uvc_1.mp4,test_uvc_2.mp4,test_uvc_3.mp4
String path = getExternalFilesDir(Environment.DIRECTORY_MOVIES) + "/test_uvc.mp4";
mediaStream.startRecord(path, 30000); final TextView pushingStateText = findViewById(R.id.pushing_state);
pushingStateText.append("\n錄像地址:" + path);
txt.setText("停止");
}
}
});
}123456789101112131415161718192021
UVC攝像頭還支持后臺推送,即不預(yù)覽的情況下進(jìn)行推送,同時再切換到前臺繼續(xù)預(yù)覽.只需要調(diào)用一個接口即可實現(xiàn),如下:
@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
ms.setSurfaceTexture(surfaceTexture); // 設(shè)置預(yù)覽的surfaceTexture}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
ms.setSurfaceTexture(null); // 設(shè)置預(yù)覽窗口為null,表示關(guān)閉預(yù)覽功能
return true;
}123456789
如果要徹底退出uvc攝像頭的預(yù)覽\推送,那只需要同時退出服務(wù)即可.
public void onQuit(View view) { // 退出
finish(); // 終止服務(wù)...
Intent intent = new Intent(this, MediaStream.class);
stopService(intent);
}1234567
## 獲取更多信息 ##
四、android第三方app怎么與微信通信
AIDL,Broadcast
以上就是關(guān)于androidapp之間通信相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
三維園林景觀設(shè)計軟件(三維園林景觀設(shè)計軟件GARLAND)
請主播帶貨費用是多少(怎么聯(lián)系主播來推廣自己產(chǎn)品)
庭院花園設(shè)計的效果圖農(nóng)村(庭院花園設(shè)計圖片欣賞)