How To Detect that Android Device is connected with USB OTG Or Not programmatically
Asked Answered
B

2

12

I am working with custom OTG fingerprint scanner. I want to check that OTG is connected to my Android device or not in a specific android activity.

Brandenburg answered 27/1, 2017 at 17:35 Comment(6)
Can any one has solution of this ?Brandenburg
Have you tried USB host? maybe android.hardware.usb.action.USB_DEVICE_ATTACHED receiver will help. if you need forward communication HERE you have nice example (for Arduino, but mostly about Android-side). but if it is "specific android device" then maybe there is a custom rom or you have "specific" doc for that deviceAreola
Yes @Areola I am using same technique. When ever device is attached I check vendor Id and Device Id and then set status of device accordingly.Brandenburg
so I should put my comment as an answer? :-)Areola
I already figure out before your answer :DBrandenburg
you have 4 upvotes (including mine), you should self-answered this question, we were all curious ;) good luck!Areola
B
4
public class BootUpReceiver extends BroadcastReceiver {
    
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    String TAG = "OTG   ";

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
//        Log.e("USB", "Device Connected -> " + action);
//Initialising global class to access USB ATTACH and DETACH state
        final GlobalClass globalVariable = (GlobalClass) context.getApplicationContext();

        if (action.equalsIgnoreCase("android.hardware.usb.action.USB_DEVICE_ATTACHED")) {

            UsbDevice device = (UsbDevice) intent
                    .getParcelableExtra(UsbManager.EXTRA_DEVICE);
            if(device != null) {
                int vendorID = device.getVendorId();
                int productID = device.getProductId();
                if(String.valueOf(productID).equalsIgnoreCase(context.getString(R.string.productID/*product id of your specific device*/))&& (String.valueOf(vendorID).equalsIgnoreCase(context.getString(R.string.vendorID/*vendor id of your specific device*/)))){
    //If Product and Vendor Id match then set boolean "true" in global variable 
                    globalVariable.setIs_OTG(true);
                }else{
                    globalVariable.setIs_OTG(false);
                }
            }
        } else if (action.equalsIgnoreCase("android.hardware.usb.action.USB_DEVICE_DETACHED")) {
      //When ever device Detach set your global variable to "false"
            globalVariable.setIs_OTG(false);
        }  }   

From any Activity you can call global variable to check the current USB state:

 final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
                        if (globalVariable.is_OTG()) {
                            //Perform your functionality
                        } 

GlobalClass:

public class GlobalClass extends Application {

    private boolean is_OTG = false;

    public boolean is_OTG() {
        return is_OTG;
    }

    public void setIs_OTG(boolean is_OTG) {
        this.is_OTG = is_OTG;
    }

}

manifest:

 <application
        android:name="com.GlobalClass"

receiver:

 <receiver
            android:name=".BootUpReceiver"
            android:enabled="true" >
          <!--  <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />

                <category android:name="android.intent.category.HOME" />
            </intent-filter>-->

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />

        </receiver>
Brandenburg answered 1/4, 2017 at 19:39 Comment(5)
Is this source working for the connection of USB OTG Pendrive ? How can i get total available space if i will get successful connection ? And how to get device Vendor id and Product id after connection ? Actually i need to connect USB OTG pendrive and get available size from connected device. Any help will be appreciated.Grugru
Use above code, When OTG is attached it will tiger broadcast and you can fetch user id and vendor id as well.Brandenburg
Fetch user id and vendor id that is fine. But my other requirement is to get all available folders and get total available space of connected USB device. How can i do that?Grugru
Did you find anything for above solution ?Grugru
@JayRathodRJ did you find the solution for your requirement that you mentioned above? If achieved could you please share the solution here? We are on the same track to do so. Thanks in Advance!Macruran
A
1

Your can use UsbManager to detect the attached otg devices.

    UsbManager usbManager = (UsbManager) this.getSystemService(Context.USB_SERVICE);
    Intent intent = new Intent("android.hardware.usb.action.USB_DEVICE_ATTACHED");
    intent.addCategory("android.hardware.usb.action.USB_DEVICE_DETACHED");
    Map<String, UsbDevice> usbDeviceList = usbManager.getDeviceList();
    Toast.makeText(this, "Deivce List Size: " + usbDeviceList.size(), Toast.LENGTH_SHORT).show();

    if (usbDeviceList.size() > 0) {

        //vid= vendor id .... pid= product id
            Toast.makeText(this, "device pid: " + device.getProductId() + " Device vid: " + device.getVendorId(), Toast.LENGTH_SHORT).show();

        }
    }
Avifauna answered 4/5, 2021 at 14:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.