android協議開發
Ⅰ Android開發之藍牙(Bluetooth)
在上一篇中有介紹了Wifi與網路連接處理
Android開發之WiFi與網路連接處理
下面,來繼續說說Android中藍牙的基本使用。
Bluetooth是目前使用的最廣泛的無線通訊協議之一,主要針對短距離設備通訊(10米),常用於連接耳機、滑鼠和移動通訊設備等。
值得一提的是:
android4.2新增了部分新功能,但是對於Bluetooth熟悉的人或許開始頭疼了,那就是Android4.2引入了一個新的藍牙協議棧針BLE。谷歌和Broadcom之間的合作,開發新的藍牙協議棧,取代了基於堆棧的Bluez。因此市場上出現了老設備的兼容問題,很多藍牙設備在android4.2手機上不能正常使用。
BluetoothAdapter簡單點來說就是代表了本設備(手機、電腦等)的藍牙適配器對象。
first:we need permission
要操作藍牙,先要在AndroidManifest.xml里加入許可權
**下面來看看如何使用藍牙。 **↓↓↓****
Demo已就緒:
返回值:如果設備具備藍牙功能,返回BluetoothAdapter 實例;否則,返回null對象。
打開藍牙設備的方式:
1.直接調用函數enable()去打開藍牙設備 ;
2.系統API去打開藍牙設備,該方式會彈出一個對話框樣式的Activity供用戶選擇是否打開藍牙設備。
注意: 1.如果藍牙已經開啟,不會彈出該Activity界面。2.在目前大多數Android手機中,是不支持在飛行模式下開啟藍牙的。如果藍牙已經開啟,那麼藍牙的開關 ,狀態會隨著飛行模式的狀態而發生改變。
1. 搜索藍牙設備
使用BluetoothAdapter的startDiscovery()方法來搜索藍牙設備
startDiscovery()方法是一個非同步方法,調用後會立即返回。該方法會進行對其他藍牙設備的搜索,該過程會持續12秒。該方法調用後,搜索過程實際上是在一個System Service中進行的,所以可以調用cancelDiscovery()方法來停止搜索(該方法可以在未執行discovery請求時調用)。
系統開始搜索藍牙設備
^( *  ̄(oo) ̄ ) ^ 系統會發送以下三個廣播:
2.掃描設備
3.定義廣播接收器接收搜索結果
4.注冊廣播
獲取附近的藍牙設備
第一步建立連接:首先Android sdk(2.0以上版本)支持的藍牙連接是通過BluetoothSocket建立連接,服務端BluetoothServerSocket和客戶端(BluetoothSocket)需指定同樣的UUID,才能建立連接,因為建立連接的方法會阻塞線程,所以伺服器端和客戶端都應啟動新線程連接。
(這里的服務端和客戶端是相對來說的)
兩個藍牙設備之間的連接,則必須實現服務端與客戶端的機制。
當兩個設備在同一個RFCOMM channel下分別擁有一個連接的BluetoothSocket,這兩個設備才可以說是建立了連接。
服務端設備與客戶端設備獲取BluetoothSocket的途徑是不同的。
1,服務端設備是通過accepted一個incoming connection來獲取的,
2,客戶端設備則是通過打開一個到服務端的RFCOMM channel來獲取的。
服務端
通過調用BluetoothAdapter的(String, UUID)方法來獲取BluetoothServerSocket(UUID用於客戶端與服務端之間的配對)
客戶端
調用BluetoothService的(UUID)方法獲取BluetoothSocket(該UUID應該同於服務端的UUID)。
調用BluetoothSocket的connect()方法(該方法為block方法),如果UUID同服務端的UUID匹配,並且連接被服務端accept,則connect()方法返回。
數據傳遞,通過以上操作,就已經建立的BluetoothSocket連接了,數據傳遞無非是通過流的形式
獲取流
該類就是關於遠程藍牙設備的一個描述。通過它可以和本地藍牙設備---BluetoothAdapter連接通信。
好多東西我也不知道怎麼描述,下面給出Demo:
剛好有剛學習的小夥伴問我ListView怎麼用,那我就用ListView。
源碼:
RairDemo
GitHub: https://github.com/Rairmmd/android-demo
Coding: https://coding.net/u/Rair/p/RairDemo/git
Ⅱ android bluetooth hid協議的開發求助
Android Bluetooth HID實現詳解
Android 關於藍牙的部分使用的是BlueZ協議棧。但是直到目前2.3.3都沒有擴展HID的profile,只是實現了最基本的Handset和d2dp的profile,所以我們的工作涉及到從應用到jni三層的修改,具體修改文件如圖所示,綠色表示新建的類,橙色表示修改的類。
一. 本地層
路徑:framework/base/core/jni/
參照android_server_BluetoothA2dpService.cpp新建android_server_bluetoothHidServer.cpp。該類中主要是通過dbus對bluez協議棧的訪問,dbus 的通用方法都在android_bluetooth_common.cpp中實現,我們做的僅僅是通過dbus_func_args_async調用到bluez提供的input介面。
主要實現以下兩個方法函數:
static jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {
#ifdef HAVE_BLUETOOTH
LOGV(__FUNCTION__);
if (nat) {
const char *c_path = env->GetStringUTFChars(path, NULL);
bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
c_path, "org.bluez.Input", "Connect",
DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(path, c_path);
return ret ? JNI_TRUE : JNI_FALSE;
}
#endif
return JNI_FALSE;
}
static jboolean disconnectSinkNative(JNIEnv *env, jobject object,
jstring path) {
#ifdef HAVE_BLUETOOTH
LOGV(__FUNCTION__);
if (nat) {
const char *c_path = env->GetStringUTFChars(path, NULL);
bool ret = dbus_func_args_async(env, nat->conn, -1, NULL, NULL, nat,
c_path, "org.bluez.Input", "Disconnect",
DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(path, c_path);
return ret ? JNI_TRUE : JNI_FALSE;
}
#endif
return JNI_FALSE;
}
這里要注意將該文件添加到AndroidRuntime.cpp和Android.mk中,否則不會編譯到動態庫中。
此部分編譯後最終生成libandroid_runtime.so並替換到system/libs下
二.Framework的java部分
路徑framework/base/java/android/server/中添加BluetoothHidService.java文件
路徑framework/base/java/android/bluetooth/中添加BluetoothHid.java和IBluetoothHid.aidl文件。
interface IBluetoothHid {
boolean connect(in BluetoothDevice device);
boolean disconnect(in BluetoothDevice device);
int getState(in BluetoothDevice device);
boolean setPriority(in BluetoothDevice device, int priority);
int getPriority(in BluetoothDevice device);
}
BluetoothHid.java中主要的兩個方法connect和disconnect間接地通過aidl訪問BluetoothHidService。這里主要是實現跨進程並為上層提供可直接訪問的方法。
由此framework的主要部分打包生成framework.Jar並最終部署到system/framework里。
三.應用(Settings.apk)
最後需要修改應用部分,應用部分的修改點比較分散,不想框架層那樣整塊模仿A2DP的樣子那麼方便,但也不是說jni部分有多麼容易。反而對於我這種對C語言不熟悉的人來說,修改jni是最頭疼得事了。好在藍牙HID這部分框架層的修改都是整塊進行的,理解上還算比價容易。
總的來說在Settings.apk中要修改的文件主要是這么幾個:
LocalBluetoothProfileManager.java這里主要提供一個HID的profile以便應用層訪問。建一個HIDProfile的class調用framework中的BluetoothHID。實際上就是通過bender機制調用了BluetoothHidService。
CashedBluetoothDevice中添加顯示藍牙鍵盤的圖標,BluetoothPairingDialog中則需要添加一段藍牙配對驗證處理的代碼,我是參照i9000中先彈出一個隨機數,然後在鍵盤中敲入相同的隨機數即配對成功,具體實現如下:
// HID
if (isDeviceKeyboard(mDevice)) {
String pin = String.format("%06d", Long.valueOf(Math
.abs(new Random().nextLong() % 1000000L)));
mPairingView.setVisibility(View.GONE);
messageView.setText(getString(
R.string.bluetooth_enter_keyboard_pin_msg, pin, name));
byte[] bytePin = BluetoothDevice.convertPinToBytes(pin);
if (bytePin != null) {
mDevice.setPin(bytePin);
}
}
……
}
轉載
Ⅲ 如何學習安卓開發
Android開發學習路線的七大階段
第一階段:Java面向對象編程;
第二階段:Java Web開發;
第三階段:android UI編程;
第四階段:android網路編程與數據存儲;
第五階段:android手機硬體管理;
第六階段:Android圖形編程技術;
第七階段:Android游戲開發。
Ⅳ 學Android開發的崗位有哪些
Android開發相關職位職責及要求,這里昆明北大青鳥android培訓老師http://www.kmbdqn.cn/給我們整理了如下幾個崗位。
一.Android開發工程師
崗位職責:
1、Android智能手機平台應用軟體的分析、設計、編碼和測試
2、智能手機應用相關的技術研究
3、從事與商品化相關的技術支持
任職資格:
1、計算機、通信、電子等相關專業本科以上學歷,一年以上工作經驗
2、熟悉Linux操作系統
3、具有J2ME或Java開發經驗,熟悉ANDROID手機軟體架構,熟悉Android平台MMI軟體開發
4、了解基本軟體開發流程,了解ClearCase/ClearQuest/UML等開發工具
5、具有良好的英文文檔編寫能力
符合以下條件者優先:
-有智能手機開發經驗者優先
-有Linux手機平台開發經驗者優先
1、計算機相關專業畢業。
2、兩年以上嵌入式系統開發經驗,一年以上的ANDROID手機平台經驗。
3、要求熟悉ANDROID手機軟體架構,精通ANDROID平台MMI軟體開發,能獨立進行應用程序開發和移植。
4、要求熟悉基本無線協議(如:GSM/GPRS/CDMA和SDL)。
5、喜歡挑戰高難度項目。
6、有較好的學習能力、溝通能力,能承受一定的工作壓力。
7、具備良好合作態度及團隊精神,並富有工作激情、創新力和責任感。
二.Android軟體開發工程師
職位描述:
1.Android手機應用軟體設計;
2.Android手機應用軟體開發;
3.Android手機軟體功能測試與驗證;
任職要求:
1.掌握Android平台應用軟體開發技術;
2.熟悉AdodbAIR編程技術者優先考慮;
3.熟悉c++/Java編程技術;
4.掌握Android系統網路編程能力;
5.Android系統軟體開發一年以上工作經驗者優先考慮;
6.工作積極、認真、刻苦,具有良好的團隊合作精神。
三.Android應用開發工程師
職位描述:
負責Android平台下應用的開發。
職位要求:
1、計算機或相關技術專業的本科及以上學位(或同等學歷);
2、豐富的C,C++或Java的編碼技能;
3、對軟體產品有強烈的責任心;
4、熱愛設計編寫程序,對IT行業充滿激情,有獨立的用代碼解決問題的能力;
5、熟悉Android應用開發框架,能獨立開發高性能的Android應用;
6、熟悉Android平台架構,有Android源碼二次開發經驗者優先;
7、有APP作品者優先。
Ⅳ 什麼是安卓協議
簡介
YY協議是怪蜀黍開發的一款以網路封包登入形式的多開軟體,
打破了傳統的YY多開器只能開幾十個號就會很卡的理念,
往往一般家庭電腦普通配置的就可以開大概8000到20000的YY賬號。
無需啟用多個的YY客戶端即可實現YY在線 進入頻道刷花 。
是各大工作室 個人 開設花房 兼職 中轉站 私服 頂人氣 直播間 批量掛皇冠號掛月票號等必備軟體。
目前有安卓協議 pc協議 支持購買正版協議。
支持
後台托盤運行 刷花 批量改名 批量修改個性簽名 獨立IP等功能(批量修改馬甲簽名、刷花、批量送月票)。
Ⅵ Android開發的分類有哪些
1、Android客戶端應用程序
如新浪微博、網銀客戶端、凡客、淘寶客戶端,快盤客戶端。Android在這里的應用還是界面層的東西為主。核心還在WEB。客戶端界面很重要,用戶體驗度很重要。從應用需求上來講,幾乎大一點的網站,都需要有手機客戶端程序。
2、Android通用類程序
如基於LBS(基於位置的服務)的應用(這類一般會嵌入到客戶端應用程序中),流媒體播放應用。由於移動設備的方便便捷、3G、4G網路的發展,這類應用有不錯的前景。
3、Android游戲開發
需要掌握的游戲引擎LGame,游戲框架等。手機上的游戲會是一大塊內容,有前途。
4、Android底層開發
需要掌握C、Linux等較底層的東西,發展方向應該是驅動、協議開發,嵌入式開發。
Ⅶ android開發SPP經典藍牙
Android 開發SPP經典藍牙。
1、傳統藍牙採用的是SPP(Serial Port Profile)協議進行數據傳輸。
2、SPP的UUID:00001101-0000-1000-8000-00805F9B34FB
3、手機一般以客戶端的角色主動連接SPP協議設備
概念:
BluetoothAdapter:
本地藍牙適配器,是所有藍牙交互的入口,表示藍牙設備自身的一個藍牙適配器,整個系統只有一個藍牙適配器,通過他可以發現其他藍牙設備,查詢綁定(配對)設備列表,使用MAC地址實例化BluetoothDevice以及創建BluetoothServerSocket用來偵聽來自其他設備的通信。
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//獲取默認的藍牙Adapter
BluetoothDevice:
遠程的藍牙設備。
private static BluetoothDevice myDevice;
myDevice = myBluetoothAdapter.getRemoteDevice(BDAddr);//獲取遠程設備,通過藍牙的MAC地址來獲取一個遠程對象
兩種連接方式
BluetoothSocket
客戶端:調用BluetoothDevice的()可以獲取該對象;調用connect()方法可以建立連接。
private static BluetoothSocket mySocket = null;
private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Method m = myDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket來選擇連接的服務和協議
mySocket = (BluetoothSocket) m.invoke(myDevice, 1);
BluetoothServerSocket:
服務端:通過BluetoothServerSocket對象可以創建BluetoothSocket對象,調用BluetoothServerSocket的accept()的方法可以得到改對象。
開發流程:
1:聲明許可權:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
2:啟動和關閉藍牙
獲取藍牙適配器,使用close()介面可以關閉藍牙適配器
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//獲取默認的藍牙Adapter
啟動藍牙
if (!blueadapter.isEnabled())
//判斷本機藍牙是否打開
{//如果沒打開,則打開藍牙
blueadapter.enable();
}
3.使用BlueAdatper搜索
使用bluetoothAdapter搜索設備,bluetoothAdapter.startDiscovery()在搜索過程中,系統會發出三個廣播信息:
ACTION_DISCOVERY_START:開始搜索
ACTION_DISCOVERY_FINISHED:搜索結束
ACTION_FOUND:找到設備
if (bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.cancelDiscovery();//如果藍牙設備未連接則取消搜索
}
bluetoothAdapter.startDiscovery();
}
4:(1)通過注冊廣播獲取搜索到的設備。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothDevice.ACTION_FOUND);//找到設備廣播
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);//搜索完成廣播
registerReceiver(receiver, intentFilter);//注冊廣播接收器
// receiver
private final BroadcastReceiver receiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// find a device
BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
//未配對設備
newDeviceArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}else {
//已經配對過的設備
TextView tvPaired = (TextView)findViewById(R.id.tv_paired);
tvPaired.setVisibility(View.VISIBLE);
lvPairedDevices.setVisibility(View.VISIBLE);
pairedDeviceArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
Log.i(TAG,"name:" + device.getName() + " address"+ device.getAddress());
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action){
// search finish
Log.i(TAG, "search finish!");
}
}
};
(2),直接得到當前的藍牙設備後,就可用通過遍歷pairedDevices ,得到當前手機已經配對過的藍牙設備。
Set<BluetoothDevice> pairedDevices = myBluetoothAdapter.getBondedDevices();//獲取當前藍牙設備
if (pairedDevices.size() <= 0) return false;
for (BluetoothDevice device : pairedDevices) {
Map<String, String> map = new HashMap<String, String>();
map.put("DeviceName", device.getName());
map.put("BDAddress", device.getAddress());
list.add(map);
5.建立連接
private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Method m = myDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});//由BluetoothDevice衍生出BluetoothSocket, createRfcommSocket來選擇連接的服務和協議
mySocket = (BluetoothSocket) m.invoke(myDevice, 1);
mySocket.connect();//使用BluetoothSocket來連接設備
6.把得到的藍牙設備給通過點擊ListView選擇設備。
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
SelectedBDAddress = list.get(arg2).get("BDAddress");
if (((ListView) arg0).getTag() != null) {
((View) ((ListView) arg0).getTag()).setBackgroundDrawable(null);
}
((ListView) arg0).setTag(arg1);
arg1.setBackgroundColor(Color.BLUE);
myDevice = myBluetoothAdapter.getRemoteDevice(SelectedBDAddress);
}
});
7.客戶端發送數據
當兩個設備成功連接之後,雙方都會有一個BluetoothSocket對象,這時,就可以在設備之間傳送數據了。
1.使用getOutputStream()方法來獲取輸出流來處理傳輸。
2.調用write()。
os = socket.getOutputStream();//獲取輸出流
if (os != null) {//判斷輸出流是否為空
os.write(message.getBytes("UTF-8"));
}
os.flush();//將輸出流的數據強制提交
os.close();//關閉輸出流
}
將輸出流中的數據提交後,要記得關閉輸出流,否則,可能會造成只能發送一次數據。
8.服務端接收數據
1.使用getInputStream()方法來獲取輸入流來處理傳輸。
2.調用read()。
InputStream im=null;
im=bluetoothSocket.getInputStream();
byte buf[] = new byte[1024];
if (is != null) {
is.read(buf, 0, buf.length);//讀取發來的數據
String message = new String(buf);//把發來的數據轉化為String類型
BuletoothMainActivity.UpdateRevMsg(message);//更新信息在顯示文本框
is.close();//關閉輸入流
使用服務端接收數據時,要先從客戶端向服務端發起連接,只有接收到連接請求之後,才會返回一個BluetoothSocket對象。有BluetoothSocket對象才能獲取到輸入流。
Ⅷ 北大青鳥設計培訓:Android開發需要學習哪些內容
隨著移動互聯網的發展,各種智能手機APP接踵而來,在手機APP應用市場中,數量最多的就是Android開發的手機軟體了。
Android開發也成為當下較熱門行業。
那麼,西安北大青鳥http://www.kmbdqn.cn/就告訴你,想要學習Android開發,需要學習哪些課程?Java面向對象編程1、Java基本數據類型與表達式,分支循環。
2、String和StringBuffer的使用、正則表達式。
3、面向對象的抽象,封裝,繼承,多態,類與對象,對象初始化和回收;構造函數、this關鍵字、方法和方法的參數傳遞過程、static關鍵字、內部類,Java的垃凱旦極回收機制,Javadoc介紹。
4、對象實例化過程、方法的覆蓋、final關鍵字、抽象類、介面、繼承的優點和缺點剖析;對象的多態性:子類和父類之間的轉換、抽象類和介面在多態中的應用、多態帶來的好處。
5、Java異常處理,異常的機制原理。
6、常用的設計模式:Singleton、Template、Strategy模式。
7、JavaAPI介紹:種基本數據類型包裝類,System和Runtime類,Date和DateFomat類等。
8、Java集合介紹:Collection、Set、List、ArrayList、Vector、LinkedList、Hashset、TreeSet、Map、HashMap、TreeMap、Iterator、Enumeration等常用集合類API。
9、JavaI/O輸入輸出流:File和FileRandomAccess類,位元組流InputStream和OutputStream,字元流Reader和Writer,以及相應實現類,IO性能分析,位元組和字元的轉化流,包裝流的概念,以及常用包裝類,計算機編碼。
10、Java高級特性:反射、代理和泛型。
11、多線程原理:如何在程序中創建多線程(Thread、Runnable),線程安全問題,線程的同步,線程之間的通訊、死鎖。
12、盯搏擾Socket網路編程。
Javaweb開發1、Java解析XML文件DOM4J。
2、MySql資料庫的應用、多表連接查詢的應用。
3、Jsp和Servlet應用。
4、Http協議解析。
。
5、Tomcat伺服器的應用配置。
6、WebService服務配置應用。
androidUI編程1、Android開發環境搭建:Android介紹,Android開發環銀運境搭建,先進個Android應用程序,Android應用程序目錄結構。
2、Android初級控制項的使用:TextView控制項的使用Button控制項的使用方法EditText控制項的使用方法ImageView的使用方法RadioButton的使用方法Checkbox的使用方法Menu的使用方法。
3、Android高級控制項的使用:Autocompletion的使用方法ListView的使用方法GridView的使用方法Adapter的使用方法Spinner的使用方法Gallary的使用方法ScrollView的使用方法。
4、對話框與菜單的使用:Dialog的基本概念AlertDialog的使用方法DatePickerDialog的使用方法Menu的使用方法自定義Menu的實現方法。
5、控制項的布局方法:線性布局的使用方法相對布局的使用方法表格布局的使用方法。
6、多Acitivity管理:AndroidManifest.xml文件的作用,Intent的使用方法,使用Intent傳遞數據的方法,啟動Activity的方法,IntentFilter的使用方法,ActivityGroup的使用方法。
7、自定義控制項實現方法:自定義ListView的實現方法,可折疊ListView的使用方法,自定義Adapter的實現方法,自定義View的實現方法,動態控制項布局的上實現方法。