2014-02-16 131 views
8

我想创建一个应用程序通过USB从Android应用程序发送数据到PC。我的代码如下:通过USB从Android应用程序发送数据到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(); 
}} 

而且我AndroidManifest 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 值。请给我助理,使它一个成功的应用。

回答

7

在我们公司,我们使用下面的代码打开具有特定ID的设备。此外,它只适用于OTG兼容设备。在你的Manifest中,你不需要USB_DETACHED,因为清单中的意图过滤器意味着打开/启动你的应用程序,除非你想在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; 
     } 
+0

我会检查并给你反馈。 – Dineshgaru

+0

另外我不知道你是否可以与你的电脑沟通,因为ADB自动启动自己的驱动程序。也许如果你尝试一台没有adb的电脑并且使用自定义驱动程序,那么可以完成。 – DaviF

相关问题