HOME 首頁
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運營
CASE 服務(wù)案例
NEWS 熱點資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    androidapp之間通信(android 應(yīng)用間通信)

    發(fā)布時間:2023-03-14 04:57:19     稿源: 創(chuàng)意嶺    閱讀: 149        問大家

    大家好!今天讓創(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

    本文目錄:

    androidapp之間通信(android 應(yīng)用間通信)

    一、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)品提高用戶體驗,獲得更多用戶。

    androidapp之間通信(android 應(yīng)用間通信)

    三、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)容。


    推薦閱讀:

    英文縮寫LAN的中文名是

    三維園林景觀設(shè)計軟件(三維園林景觀設(shè)計軟件GARLAND)

    emancipate翻譯(emptied翻譯)

    請主播帶貨費用是多少(怎么聯(lián)系主播來推廣自己產(chǎn)品)

    庭院花園設(shè)計的效果圖農(nóng)村(庭院花園設(shè)計圖片欣賞)