2014-02-16 3 views
8

Android-app에서 PC로 USB를 통해 데이터를 전송하는 앱을 만들고 싶습니다.Android 앱에서 USB를 통해 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 파일은 다음과 같다 : 항상 null 의 값을 보여줍니다 내가 UsbDevice mDevice;으로 문제를 얻고있다

<?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> 

을 나에게 그것을 확인하기 위해 조수를주십시오 다음과 같이 내 코드는 성공적인 앱.

답변

7

우리 회사에서는 다음 코드를 사용하여 특정 ID를 가진 장치를 엽니 다. 또한 OTG 호환 장치에서만 작동합니다. 매니페스트의 인 텐트 필터는 앱을 열거 나 실행하기위한 것이므로 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가 자동으로 자체 드라이버로 시작하므로 PC와 통신 할 수 있는지 잘 모릅니다. 어쩌면 당신이 adb없이 PC에 시도하고 사용자 정의 드라이버와 함께 할 수 있습니다. – DaviF

관련 문제