Android Usb設(shè)備的監(jiān)聽(Dev)外設(shè)端口的判定以及耳機的插拔
最近在公司用到外設(shè),需要判斷接入的外設(shè)的VendorId和ProductId,然后給大家說一下自己的學(xué)習(xí)成果把 ,首先我門可以通過android.hardware.usb.action.USB_STATE監(jiān)聽自己的Usb連接的設(shè)備,只針對Usb設(shè)備。而想要監(jiān)聽外部設(shè)備的時候卻需要另外的兩個廣播進(jìn)行監(jiān)聽"android.hardware.usb.action.USB_DEVICE_ATTACHED"和"android.hardware.usb.action.USB_DEVICE_DETACHED"。要是想對耳機或者耳機的狀態(tài)進(jìn)行監(jiān)聽的時候需要的廣播是"android.intent.action.HEADSET_PLUG" 通過
int inttype=intent.getIntExtra("microphone",0)來獲取耳機是否有麥克風(fēng)。inttype==0表示沒有耳機inttype==1表示有耳機
我個人的建議就是將一部分代碼(根據(jù)個人情況而定)放到服務(wù)里面,或者是Application里面。
import com.example.usbusb.utils.ToastUtils;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
//耳機的廣播
public static final String TAGLISTEN = "android.intent.action.HEADSET_PLUG";
//usb線的廣播
private final static String TAGUSB = "android.hardware.usb.action.USB_STATE";
//外設(shè)的廣播
public static final String TAGIN = "android.hardware.usb.action.USB_DEVICE_ATTACHED";
public static final String TAGOUT = "android.hardware.usb.action.USB_DEVICE_DETACHED";
private boolean BOOLEAN=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//賽選器
IntentFilter filter = new IntentFilter();
//篩選的條件
filter.addAction(TAGIN);
filter.addAction(TAGOUT);
filter.addAction(TAGUSB);
//注冊廣播 動態(tài)注冊
registerReceiver(receiver, filter);
}
/**
* 創(chuàng)建廣播的類
*/
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//判斷外設(shè)
if (action.equals(TAGIN)) {
ToastUtils.shwotoast(context, "外設(shè)已經(jīng)連接");
//Toast.makeText(context, "外設(shè)已經(jīng)連接", Toast.LENGTH_SHORT).show();
}
if (action.equals(TAGOUT)) {
if (BOOLEAN) {
ToastUtils.shwotoast(context, "外設(shè)已經(jīng)移除");
//Toast.makeText(context, "外設(shè)已經(jīng)移除", Toast.LENGTH_SHORT).show();
}
}
//判斷存儲usb
if (action.equals(TAGUSB)) {
boolean connected = intent.getExtras().getBoolean("connected");
if (connected) {
ToastUtils.shwotoast(context, "USB 已經(jīng)連接");
//Toast.makeText(MainActivity.this, "USB 已經(jīng)連接",Toast.LENGTH_SHORT).show();
} else {
if (BOOLEAN) {
ToastUtils.shwotoast(context, "USB 斷開");
//Toast.makeText(MainActivity.this, "USB 斷開",Toast.LENGTH_SHORT).show();
}
}
}
//判斷耳機
if (action.equals(TAGLISTEN)) {
int intExtra = intent.getIntExtra("state", 0);
// state --- 0代表拔出,1代表插入
// name--- 字符串,代表headset的類型。
// microphone -- 1代表這個headset有麥克風(fēng),0則沒有
// int i=intent.getIntExtra("",0);
if (intExtra == 0) {
if (BOOLEAN) {
ToastUtils.shwotoast(context,"拔出耳機");
//Toast.makeText(context, "拔出耳機", Toast.LENGTH_SHORT).show();
}
}
if (intExtra == 1) {
ToastUtils.shwotoast(context, "耳機插入");
//Toast.makeText(context, "耳機插入", Toast.LENGTH_SHORT).show();
int intType = intent.getIntExtra("microphone", 0);
if (intType == 0) {
ToastUtils.shwotoast(context, "沒有麥克風(fēng)");
//Toast.makeText(context, "沒有麥克風(fēng)" + intType,Toast.LENGTH_SHORT).show();
}
if (intType == 1) {
ToastUtils.shwotoast(context,"有話筒" );
//Toast.makeText(context, "有話筒" + intType,Toast.LENGTH_SHORT).show();
}
}
}
BOOLEAN=true;
}
};
/**
* 注銷廣播
*/
protected void onDestroy() {
unregisterReceiver(receiver);
};
}
ToastUtils工具類
import android.content.Context;
import android.widget.Toast;
public class ToastUtils {
public static Toast toast=null;
private ToastUtils toastUtils=new ToastUtils();
private ToastUtils(){}
public static void shwotoast(Context context,String msg){
if (toast==null) {
toast=Toast.makeText(context, msg, Toast.LENGTH_SHORT);
}else {
if (toast!=null) {
toast.setText(msg);
}
}
toast.show();
}
}
下面的一個就是獲取每一個Id的端口號通過在Usb的廣播里面調(diào)用這個方法判斷是否是自己的設(shè)備,這樣就可完成自己想要的操作了(注意當(dāng)看到設(shè)備的ID是以0x開頭的是十六位的 然后轉(zhuǎn)化成十進(jìn)制的數(shù)就能看到自己的東西了)
import java.util.HashMap;
import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
public class MainActivity extends ActionBarActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> map = usbManager.getDeviceList();
System.out.println("......................befor....................................");
for(UsbDevice device : map.values()){
System.out.println(".......one..........dName: " + device.getDeviceName());
System.out.println(".......tow.........vid: " + device.getVendorId() + "\t pid: " + device.getProductId());
}
System.out.println("........................after..................................");
}
結(jié)果我們都能看到有兩個設(shè)備

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Android 實時監(jiān)測(監(jiān)聽)網(wǎng)絡(luò)連接狀態(tài)變化
這篇文章主要介紹了Android 實時監(jiān)測(監(jiān)聽)網(wǎng)絡(luò)連接狀態(tài)變化的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06
Android仿京東淘寶自動無限循環(huán)輪播控件思路詳解
在App的開發(fā)中,很多的時候都需要實現(xiàn)類似京東淘寶一樣的自動無限輪播的廣告欄,這里小編寫了一個,分享到腳本之家平臺供大家參考2017-04-04
解析:android 如何從JPEG生成BufferedImage
本篇文章是對在android中,如何從JPEG生成BufferedImage的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android?RecyclerView使用ListAdapter高效刷新數(shù)據(jù)的操作方法
這篇文章主要介紹了Android?RecyclerView使用ListAdapter高效刷新數(shù)據(jù),本次也是介紹了用另外一種方法來實現(xiàn)RecyclerView高效刷新數(shù)據(jù)的功能,需要的朋友可以參考下2022-10-10
Android利用Flutter?path繪制粽子的示例代碼
端午將至,作為中華民族的非常重要的傳統(tǒng)節(jié)日,粽子那是必不可少的。今天跟隨本篇文章用Flutter?path畫一個會科普節(jié)日的的粽子吧2022-05-05

