您的位置:首页 > 其它

安卓广播监听USB插拔

2017-11-10 11:18 1201 查看
广播监听USB链接

一、项目清单中注册广播监听USB插拔。有2个意图过滤器,一个是自定义的android:name="myaction"(传送数据到广播类时用的),另一个是只监听USB插拔的android:name="android.hardware.usb.action.USB_STATE"。

<receiver

     android:name=".DetactUSB"

     android:launchMode="singleTask">

     <intent-filter android:priority="99">

     <action android:name="myaction" />

     </intent-filter>

     <intent-filter android:priority="99">

      <action android:name="android.hardware.usb.action.USB_STATE" />

     </intent-filter>

 </receiver>

二、广播类

public class DetactUSB   extends BroadcastReceiver {

    public static String MYACTION = "myaction";                    //接收自定义action 传送的信息。

    public  static boolean   USBconnected =false;

    @Override

    public void onReceive(Context context, Intent intent) {

                                                                   //abortBroadcast();//当加上这条代码的时候,广播发送到此结束,即第其他广播不会再收到。  

   

        String action = intent.getAction();

        if (action.equals(DetactUSB.MYACTION)) {

                  String name = intent.getStringExtra("name");

                  if(name .equals("ok")){

                  //获取数据做相应处理。

                  }

        }else if (action.equals(DefaultView_Activity.ACTION)) {

       

             USBconnected = intent.getExtras().getBoolean("connected");

             if (USBconnected) {                                  //USB is connected USB已经链接,跳转到Activity中

             

              Intent myIntent = new Intent(context, XXXXXX.class);

              myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

              context.startActivity(myIntent);

              }else{                                             //USB no connected   提示USB未连接

                USBconnected=false;

              }

           

        }

    }

}

二、事件类中。 XXXXXX.class需要传送数据到广播中。

                Intent receiveIntent=new Intent();

                receiveIntent.putExtra("name", "ok");
                MyApplication.getContext().sendOrderedBroadcast(receiveIntent, null);

例子:

USB链接后与PC端Socket数据交互线程中

public class MyServerTest implements Runnable {

   public static   Socket client = null;

    public static  ServerSocket serverSocket;

    public static  List<Socket> socketList = new ArrayList<Socket>();

    public         Intent receiveIntent;

    public MyServerTest() {

                receiveIntent=new Intent();

                receiveIntent.setAction(DetactUSB.MYACTION);              

    }

    @Override

    public void run() {

       
4000
try {

            serverSocket = new ServerSocket(8087);

            //Log.e("TAG", "usb开启服务器启动等待客户端连接");

            while (true) {//持续接收客户端

                receiveIntent.putExtra("name", "ok");

                MyApplication.getContext().sendOrderedBroadcast(receiveIntent, null);

                Log.e("等待客户端", "等待客户端");

                client = serverSocket.accept();//客户端对象

                socketList.add(client);

                Log.e("客户端", "已连接");

                receiveIntent.putExtra("name", "accept");

                MyApplication.getContext().sendOrderedBroadcast(receiveIntent, null);

                doRead(serverSocket,client);

            }

        } catch (IOException e) {

            e.printStackTrace();

           // Log.e("IOException", e.toString());

        }

    }

}

public class DetactUSB   extends BroadcastReceiver {

    public static String MYACTION = "myaction";                    //接收自定义action 传送的信息。

    public  static boolean   USBconnected =false;

    @Override

    public void onReceive(Context context, Intent intent) {

                                                                   //abortBroadcast();//当加上这条代码的时候,广播发送到此结束,即第其他广播不会再收到。  

   

        String action = intent.getAction();

        if (action.equals(DetactUSB.MYACTION)) {

                  String name = intent.getStringExtra("name");

                  if(name .equals("ok")){

                  //获取数据做相应处理。

                  }

        }else if (action.equals(DefaultView_Activity.ACTION)) {

       

             USBconnected = intent.getExtras().getBoolean("connected");

             if (USBconnected) {                                  //USB is connected USB已经链接,跳转到Activity中

             

                                     if (MyServerTest.socketList.size()>0){  //USB每链接一次,XXXXX.class中线程会打开一次8087端口,这个集合用来清空上次打开的端口,避免端口占用。

                                      MyServerTest.socketList.clear();

                                      }

                                       Intent myIntent = new Intent(context, XXXXXX.class);  //USB已经链接,跳转到Activity中

                                       myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                                       context.startActivity(myIntent);

            } else {                                                                 //USB no connected   提示USB未连接

                                USBconnected=false;

                                 if(DetactUSB.contextList.size()==0){      

                                //DetactUSB.contextList.集合保存打开的xxxxx.class  当USB链接中断或USB链接失败时,关闭跳转成功时打开的xxxx.class  关闭上次链接打开的端口。

                               Utils.showToast("USB no connected");

                                   }else{

                                Utils.showToast("USB no connected");

                                    getFinish();

                               }

           

        }

    }

 public void getFinish() {

        try {

            if(MyServerTest.socketList.size()>0 ) {

                MyServerTest.client.close();

                MyServerTest.serverSocket.close();

            }else if(MyServerTest.socketList.size()==0 ) {

                    MyServerTest.serverSocket.close();

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

        if(DetactUSB.contextList.size()>0){

          

            for(Activity  context1:DetactUSB.contextList){

                context1.finish();

            }

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: