1. 程式人生 > >AllJoyn+Android開發案例-android跨裝置呼叫方法

AllJoyn+Android開發案例-android跨裝置呼叫方法

package com.example.siemens.testgetmethod;

import android.app.Service;
import android.content.Intent;
import android.net.wifi.WifiConfiguration;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

import org.alljoyn.bus.BusAttachment;
import org.alljoyn.bus.BusObject;
import org.alljoyn.bus.Mutable;
import org.alljoyn.bus.SessionOpts;
import org.alljoyn.bus.SessionPortListener;
import org.alljoyn.bus.Status;

import javax.net.ssl.SSLEngineResult;

public class MyService extends Service {

    private final String TAG="MyService";

    public MyService() {
//        super();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
//        throw new UnsupportedOperationException("Not yet implemented");
        return null;
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
//        Log.i(TAG, "onStartCommand()");
        return START_STICKY;
    }

    public void onDestroy() {
//        backgroundHandler.exit();
    }

    public void onCreate(){
        Log.i(TAG,"onCreate method.");
        //mbus初始化
        mBus=new BusAttachment(getPackageName(),BusAttachment.RemoteMessage.Receive);
        startBusThread();
        if(backgroundHandler!=null)
            backgroundHandler.connect();
        else
            return;
    }

    private void startBusThread(){
        HandlerThread handlerThread=new HandlerThread("My HandlerThread");
        handlerThread.start();
        Looper loop=handlerThread.getLooper();
        backgroundHandler=new BackgroundHandler(loop);
        Log.i(TAG,"startBusThread method.");
    }

    //請求都線上程中執行
    private BackgroundHandler backgroundHandler=null;
    private final int CONNECT=2;

    //私有內部不可變類
    private final class BackgroundHandler extends Handler{
        public BackgroundHandler(Looper looper){
            super(looper);
        }

        public void connect(){
            Log.i(TAG,"backgroundHandler.connect()");
            Message msg=backgroundHandler.obtainMessage(CONNECT);//相當於message.what=2;
            backgroundHandler.sendMessage(msg);
        }

        public void handleMessage(Message msg){
            switch(msg.what){
                case CONNECT:
                    doConnect();
                    break;
                default:
                    break;
            }
        }
    }

    //建立匯流排附件物件,getPackageName()出現NullPointerException異常,先於建構函式執行,此時物件為null,所以放到oncreate裡邊去
//    private BusAttachment mBus=new BusAttachment(getPackageName(),BusAttachment.RemoteMessage.Receive);
    private BusAttachment mBus=null;
    //建立匯流排物件
    private MyBusObject myBusObject=new MyBusObject();
    //匯流排物件類,實現匯流排介面和匯流排物件介面
    class MyBusObject implements MyInterface,BusObject{
//        public void show(String args){
//            Toast.makeText(getApplicationContext(),args,Toast.LENGTH_SHORT).show();     //會呼叫的遠端方法
//
//        }
//
//        public int add(int a,int b){                        //會呼叫的遠端方法
//            return a+b;
//        }
        public String cat(String a,String b){
            a=a.replace('H','T');
            b=b.replace('W','B');
            return a+b;
        }
    }

    //session的埠號
    private static final short CONTACT_PORT=42;
    //匯流排物件,匯流排附件等連線到總線上的實現函式,建立的是service
    private void doConnect(){
        org.alljoyn.bus.alljoyn.DaemonInit.PrepareDaemon(getApplicationContext());  //啟動守護程序

        Status status=mBus.registerBusObject(myBusObject,"/myBusObject");                     //註冊匯流排物件
        if (Status.OK != status) {
            System.out.println("BusAttachment.registerBusObject() failed: " + status);
            System.exit(0);
            return;
        }

        //匯流排附件連線到總線上
        status=mBus.connect();
        if (status != Status.OK) {
            Log.i(TAG,"BusAttachment connect to bus failed.");
            System.exit(0);
            return;
        }

        //通訊的session port 設定
        Mutable.ShortValue contactPort = new Mutable.ShortValue(CONTACT_PORT);
        SessionOpts sessionOpts = new SessionOpts();
        sessionOpts.traffic = SessionOpts.TRAFFIC_MESSAGES;
        sessionOpts.isMultipoint = false;
        sessionOpts.proximity = SessionOpts.PROXIMITY_ANY;
        sessionOpts.transports = SessionOpts.TRANSPORT_ANY;

        //繫結通訊的session port
        status=mBus.bindSessionPort(contactPort,sessionOpts,new SessionPortListener(){
            @Override
            public boolean acceptSessionJoiner(short sessionPort, String joiner, SessionOpts sessionOpts){
                if (sessionPort == CONTACT_PORT) {
                    return true;
                } else {
                    return false;
                }
            }
        });
        if (status != Status.OK) {
            Log.i(TAG,"bind certain session port failed.");
            System.exit(0);
            return;
        }

        //向匯流排請求一個名稱
        int flags = 0; //do not use any request name flags
        status = mBus.requestName("com.test.well.known.name", flags);
        if (status != Status.OK) {
            Log.i(TAG,"request name from bus failed.");
            System.exit(0);
            return;
        }

        //在總線上宣告name的存在
        status = mBus.advertiseName("com.test.well.known.name", SessionOpts.TRANSPORT_ANY);
        if (status != Status.OK) {
            Log.i(TAG,"advertise name on bus failed.");
            mBus.releaseName("com.test.well.know.name");
            System.exit(0);
            return;
        }else
            Toast.makeText(getApplicationContext(),"advertise name=com.test.well.known.name",Toast.LENGTH_SHORT).show();

    }

    static{
        System.loadLibrary("alljoyn_java");
    }
}
注意:靜態初始化塊中的loadlibrary不能少掉。上面的例子參照的是chat原始碼。

相關推薦

AllJoyn+Android開發案例-android裝置呼叫方法

package com.example.siemens.testgetmethod; import android.app.Service; import android.content.Intent; import android.net.wifi.WifiConfiguration; import an

Android開發 - 獲取Android裝置的唯一標識碼(Android 6.0或更高)

在我們的APP開發中,通常需要獲取到裝置的唯一標識。在Android6.0之前,有很多方法我們可以方便獲取到硬體的唯一標識,但是在Android6.0之後,Android系統大幅限制了我們獲取裝置的硬體資訊。 Android6.0之前的方法(已過時) DEVICE_ID通getSyste

Android開發中在JAVA中呼叫C/C++ native程式碼

Android 從Java呼叫C/C++ 當無法用 Java 語言編寫整個應用程式時,JNI 允許您呼叫C/C++本機程式碼。在下列典型情況下,您可能決定使用本機程式碼: 希望用更低階、更快的程式語言C/C++去實現對時間有嚴格要求的程式碼。

Android開發案例Android中幾種影象特效處理

·      ·           Android中有很多圖片特效處理技巧,比如圓角、倒影,今天為大家分享一個例項,本例主要是先獲取桌布(getWallpaper()),然後對當前桌布的一些特效處理。   第一步:新建一個Android工程命名為ImageDemo,工程

Android開發: 在Android虛擬裝置中使用SDCard及問題分析

一.為Android虛擬裝置新增SDCard 1.開啟AVDM,選擇要一個虛擬裝置 2.選擇Edit,編輯一個AVD,在SD Card欄中,Size中輸入SDCard的大小100(或者file中選擇一個sdcard的img檔案),點選Edit AVD關閉視窗,這樣就可以在

Android開發中如何實現裝置與賬號繫結

最近在二建培訓機構大立教育的網課App上面看到這種情形,他們在做使用者驗證的時候還做了賬號密碼與裝置繫結的操作。一時好奇在網上查詢實現原理,看到了其中的實現發方式的一種可行方式。首先與伺服器商量好一個欄位用於存放裝置的唯一標識,在登入的時候獲取裝置唯一標識,我採用的是MAC地

android studio使用Aidl程序呼叫服務

以前就知道其大概程式碼流程,但是一直沒有敲程式碼去實現,今天將其實現了,android studio下編寫也遇到了一些小細節的問題,特此記錄一下。 既然是模擬Aidl通訊,那麼當然要編寫兩個應用了,一個提供服務給另一個應用呼叫,那麼開始吧。 一、服務提供方應

Android開發Android程序通訊(AIDL)官方文件及官方Demo講解

第一章、 關於Android跨程序的思考 先來回顧一下作業系統中的一些概念。  同一個程序中可以有多個執行緒,執行緒間通訊可以直接取得地址。因為Java程式的記憶體分配在連續的地址空間。  預設一個Java程式會開啟一個程序,執行在JVM中。但

Android開發案例:SQLite資料庫和ListView列表結合

        SQLite是Android系統內建的輕量級的關係型資料庫,執行速度非常快;ListView是Android中最常用的的控制元件之一,幾乎所有的應用程式都會用到它。本文通過一個例項介紹如何通過ListView列表展示資料以及實現SQLite資料庫的增刪改查,

android開發中通過aidl實現遠端方法呼叫

在安卓開發過程中我們可能見過這樣的問題,就是在一個應用中呼叫另一個應用中的服務,並呼叫該服務中的方法。 我們可能對呼叫服務並不陌生,可是要執行服務中的方法,卻不能直接呼叫。因為兩個服務和呼叫它的程式屬

Android開發:解決三星裝置拍照後獲取的圖片被旋轉的問題

呼叫Android系統拍照功能後,三星手機拍攝後的照片被旋轉了90度,橫著拍變成豎的,豎著拍變成橫的。。。測試其它品牌的手機是正常的,就三星出現這個問題。 解決方法: 1、首先在呼叫拍照方法時,儲存拍照後的相片原圖,得到原圖路徑,(PhotoBitmapUtils是我

Android開發——藍芽多裝置連線(四)

前言 經過一個多月的時間藍芽多裝置連線的重構終於告一段落了,這次的重構不止是程式碼方面的完善,還結合了一些使用者的使用場景,另外增加一些離線操作,使手機端對藍芽的操作更加的便捷,對藍芽裝置的管理更加統一。 場景分析 支援的場景 多裝置連線(一個

Android開發 - 獲取Android設備的唯一標識碼(Android 6.0或更高)

申請 安全 地址 vat util new 應該 ret ati 在我們的APP開發中,通常需要獲取到設備的唯一標識。在Android6.0之前,有很多方法我們可以方便獲取到硬件的唯一標識,但是在Android6.0之後,Android系統大幅限制了我們獲取設備的硬件信息。

Android開發Android studio 3.2.1配置androidannotations

androidannotations,Butterknife 元件等大大的提高了開發效率,但在配置androidannotations 的時候卻出現了問題,根據根據網上的資料配置 annotationProcessor “org.androidannotations:androidannot

Android開發Android自定義View

本文為博主- 山水相逢-z  原創文章,地址: https://blog.csdn.net/weixin_38251977/article/details/82286127 上週遇到一個需求,用一個圓形進度條的形式來展示某項操作所佔的比例,雖然類似的輪子已經有很多了,但是

Android開發-在Android應用裡整合友盟訊息推送SDK的實現(相容小米、華為、魅族機型離線推送)

前 言 最近由於專案的功能需求的需要,需要在Android應用整合訊息推送的功能,而目前市面上的第三方訊息推送除了友盟推送外,還有極光推送、小米推送、個推以及信鴿(騰訊)推送等。當時本人對比各大第三方的訊息推送進行了測試,覺得友盟訊息推送整合簡單,推送訊息的

Android開發Android Studio開發環境)“R”全部變紅的可能原因之一

一般在建立layout資源時,對layout命名時,名稱中存在大寫字母時,一般不會通過。但在修改layout檔名稱時,卻不會檢查這個要求,若存在大寫字母時,程式在編譯時,R會全部變紅,這時可以檢視編譯錯

Android開發Android Studio)——環境

原始碼左側標籤,從上到下:Project、Structure、Captures、Favorites。 Project標籤,表示該專案的目錄結構。 Structure標籤,表示該程式碼的內部方法結構。 手動重新編譯: Build→Make Project,編譯整個專

Android開發Android-Studio 開發環境配置

今天給大家帶來一篇Android開發的文章,這也正是督促我自己學習安卓開發的一個方式,本文作為開篇文章,就很簡單的給大家演示下Android-Studio開發環境的配置步驟;目前大家在安卓開發上用的最多的可能就是Android-Studio了,在我讀大學的時候聽

Android開發Android 刪除指定檔案和資料夾

/** * 刪除單個檔案 * @param filePath 被刪除檔案的檔名 * @return 檔案刪除成功返回true,否則返回false */ public boolean deleteFile(String filePath) {