通过USB从Android App向PC发送数据

时间:2014-02-16 06:50:29

标签: android usb

我想创建一个应用程序,通过USB从Android-app向PC发送数据。我的代码如下:

package com.sample.dummy.app.senddatathoughserialport;

import java.io.UnsupportedEncodingException;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.hardware.usb.UsbDevice;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity 
{


@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final TextView tv = (TextView)findViewById(R.id.multiAutoCompleteTextView1);
    Button sButton = (Button) findViewById(R.id.button1);
    final UsbManager manager = (UsbManager) this.getSystemService(Context.USB_SERVICE);
    Toaster(""+manager);

    // -- register click event with first button ---
    sButton.setOnClickListener(new View.OnClickListener() 
    {
       @SuppressWarnings({ "unused" })
       public void onClick(View v) 
       {         
            try
            {
                Intent intent = new Intent("android.hardware.usb.action.USB_DEVICE_ATTACHED");
                UsbDevice mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.ACTION_USB_DEVICE_ATTACHED);
                Toaster(""+mDevice);
                final UsbDeviceConnection connection = manager.openDevice(mDevice); 

                UsbInterface usbIf = null;
                Toaster("Its ok here 1");
                int count = mDevice.getInterfaceCount();
                Toaster("Its ok here 1");
                for(int i=0; i< count; i++)
                {
                    usbIf = mDevice.getInterface(i);
                }

                UsbEndpoint epIN = null;
                UsbEndpoint epOUT = null;
                Toaster("It's ok here 2");
                for (int i = 0; i < usbIf.getEndpointCount(); i++) 
                {            
                   if (usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)
                   {                 
                        if (usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN)                         
                        epIN = usbIf.getEndpoint(i);
                        else
                        epOUT = usbIf.getEndpoint(i);
                   } 
                   else 
                   {
                        Log.d("USB","Not Bulk");
                        Toaster("Thedaa log daggara");
                   }
                }

                String get = tv.getText().toString();
                try
                {
                    byte[] str = get.getBytes(get);
                    connection.bulkTransfer(epOUT, str, str.length, 500);
                } 
                catch (UnsupportedEncodingException e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    Toaster("Data sending failed!");
                }
                finally
                {
                    Toaster("Data sent through USB !");
                }
            }
            catch(Exception e)
            {
                Log.d("Failed", e.toString());  
                Toaster("Attempt Failed !!");
            }
       }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
public void Toaster(String string)
{
    Toast.makeText(this, string,Toast.LENGTH_LONG).show();
}}

我的Android Manifest Xml文件如下:

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 package="com.sample.dummy.app.senddatathoughserialport"
                                 android:versionCode="1"
                                android:versionName="1.0" >
 <uses-feature android:name="android.hardware.usb.host" />
 <uses-sdk android:minSdkVersion="12" />
 <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.sample.dummy.app.senddatathoughserialport.MainActivity"
        android:label="@string/app_name" >
        <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" />
        <meta-data
            android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
            android:resource="@xml/device_filter" />        
    </activity>        
</application></manifest>

我遇到的问题UsbDevice mDevice;始终显示null的值 请给我助手让它成为一个成功的应用程序。

1 个答案:

答案 0 :(得分:7)

在我们公司,我们使用以下代码打开具有特定ID的设备。它也只适用于OTG兼容设备。在你的Manifest中你不需要USB_DETACHED,因为manifest中的intent-filters意味着打开/启动你的app,除非你想在usb分离时打开你的apk。只需点击即可调用ConnectUSB;

    UsbInterface usbInterface;
    UsbEndpoint usbEndpointIN, usbEndpointOUT;
    UsbDeviceConnection usbDeviceConnection;
    UsbDevice deviceFound = null;
    USB USB;

    ArrayList<String> listInterface;
    ArrayList<UsbInterface> listUsbInterface;
    ArrayList<String> listEndPoint;
    ArrayList<UsbEndpoint> listUsbEndpoint;

    private static final int targetVendorID = 8260;
    private static final int ProductID = 1000;    

        private boolean connectUsb() {
            boolean result = false;     
            switch(checkDeviceInfo())
            {
                case ProductID:
                        result = StartUSB();
                    break;
            }
            return result;
        }

        private int checkDeviceInfo() {

            deviceFound = null;

            UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
            HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
            Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();

            while (deviceIterator.hasNext()) {
                UsbDevice device = deviceIterator.next();

                if(device.getVendorId()==targetVendorID) {
                    deviceFound = device;

                    switch(device.getProductId()) {
                        case ProductID:
                            GetInterface(deviceFound);
                            GetEndpoint(deviceFound);
                            return ProductID;

                        default:
                            Toast.makeText(this, getString(R.string.err_unknow_device), Toast.LENGTH_LONG).show();
                            break;
                    }
                    return -1;
                }
            }
            return -1;
        }

        private void GetInterface(UsbDevice d) {
            listInterface = new ArrayList<String>();
            listUsbInterface = new ArrayList<UsbInterface>();
            for(int i=0; i<d.getInterfaceCount(); i++){
                UsbInterface usbif = d.getInterface(i);
                listInterface.add(usbif.toString());
                listUsbInterface.add(usbif);
            }

            if(d.getInterfaceCount() > 0) 
            {   
                usbInterface = listUsbInterface.get(1);
            }
            else usbInterface = null;
        }

        private void GetEndpoint(UsbDevice d) {
            int EndpointCount = usbInterface.getEndpointCount();    
            listEndPoint = new ArrayList<String>();
            listUsbEndpoint = new ArrayList<UsbEndpoint>();

            for(int i=0; i<usbInterface.getEndpointCount(); i++) {
                UsbEndpoint usbEP = usbInterface.getEndpoint(i);
                listEndPoint.add(usbEP.toString());
                listUsbEndpoint.add(usbEP);
            }

            // deixar fixo para TxBlock USB
            if(EndpointCount > 0) {
                usbEndpointIN = usbInterface.getEndpoint(0);
                usbEndpointOUT = usbInterface.getEndpoint(1);
            }           
            else {
                usbEndpointIN = null;
                usbEndpointOUT = null;
            }
        }

        private boolean StartUSB() {
            boolean result = false;
            UsbDevice deviceToRead = deviceFound;
            UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

            Boolean permitToRead = manager.hasPermission(deviceToRead);

            if(permitToRead) {
                result = OpenDevice(deviceToRead);
            }else {
                Toast.makeText(this, 
                        getString(R.string.err_no_permission) + permitToRead, 
                        Toast.LENGTH_LONG).show();
            }

            return result;
        }

        private boolean OpenDevice(UsbDevice device){

            boolean forceClaim = true;

            UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
            usbDeviceConnection = manager.openDevice(device);

            if(usbDeviceConnection != null){
                usbDeviceConnection.claimInterface(usbInterface, forceClaim);
                return true; 
            }else{
                Toast.makeText(this, 
                        getString(R.string.err_no_open_device), 
                        Toast.LENGTH_LONG).show();
            }

            return false;
        }