溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android Usb設備的監(jiān)聽(Dev)外設端口的判定以及耳機的插拔

發(fā)布時間:2020-09-08 12:47:29 來源:腳本之家 閱讀:163 作者:ChaoLi_Chen 欄目:移動開發(fā)

最近在公司用到外設,需要判斷接入的外設的VendorId和ProductId,然后給大家說一下自己的學習成果把 ,首先我門可以通過android.hardware.usb.action.USB_STATE監(jiān)聽自己的Usb連接的設備,只針對Usb設備。而想要監(jiān)聽外部設備的時候卻需要另外的兩個廣播進行監(jiān)聽"android.hardware.usb.action.USB_DEVICE_ATTACHED""android.hardware.usb.action.USB_DEVICE_DETACHED"。要是想對耳機或者耳機的狀態(tài)進行監(jiān)聽的時候需要的廣播是"android.intent.action.HEADSET_PLUG" 通過

int inttype=intent.getIntExtra("microphone",0)來獲取耳機是否有麥克風。inttype==0表示沒有耳機inttype==1表示有耳機

我個人的建議就是將一部分代碼(根據(jù)個人情況而定)放到服務里面,或者是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";
 //外設的廣播
 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();
  //判斷外設
  if (action.equals(TAGIN)) {
  ToastUtils.shwotoast(context, "外設已經(jīng)連接");
  //Toast.makeText(context, "外設已經(jīng)連接", Toast.LENGTH_SHORT).show();
  }
  if (action.equals(TAGOUT)) {
  if (BOOLEAN) {
   ToastUtils.shwotoast(context, "外設已經(jīng)移除");
   //Toast.makeText(context, "外設已經(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有麥克風,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, "沒有麥克風");
   //Toast.makeText(context, "沒有麥克風" + 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)用這個方法判斷是否是自己的設備,這樣就可完成自己想要的操作了(注意當看到設備的ID是以0x開頭的是十六位的 然后轉(zhuǎ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é)果我們都能看到有兩個設備

Android Usb設備的監(jiān)聽(Dev)外設端口的判定以及耳機的插拔

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI