Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Programation d'une connexion USB

Sujet résolu
    6 février 2013 à 16:30:28

    Bonjour les gens,

    Je cherche à réaliser une connexion USB entre un androphone et un microcontrôleur Microchip. Le microcontrôleur est l'host de la connexion.

    J'ai cherché sur le site developer.android.com où j'ai trouvé les fonctions Usb Accessory (http://developer.android.com/guide/topics/connectivity/usb/accessory.html) mais certaine parties ne sont pas acceptées par éclipse (ou mal comprise par moi) et le programme plante à l'initialisation de la connexion.

    Voici mon code :

    package com.test.projet;
    
    import java.io.FileDescriptor;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import android.hardware.usb.UsbAccessory;
    import android.hardware.usb.UsbManager;
    import android.os.Bundle;
    import android.os.ParcelFileDescriptor;
    import android.app.Activity;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
    	private TextView coucou = null;
    	private ParcelFileDescriptor mFileDescriptor;
    	private FileInputStream mInputStream;
    	private FileOutputStream mOutputStream;
    	private static final String ACTION_USB_PERMISSION =
    		    "com.android.example.USB_PERMISSION";
    	protected static final String TAG = null;
    	private UsbManager mUsbManager = null;
    	private PendingIntent mPermissionIntent = null;
    	private UsbAccessory accessory = null;
    	
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    	    coucou = (TextView) findViewById(R.id.coucou);		//L'objet coucou servira ensuite à afficher la progression du programme
    	    mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    	    
    	    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
    	    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    	    registerReceiver(mUsbReceiver, filter);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.activity_main, menu);
    		return true;
    	}
    //Fonction récupérée sur le site developer android
    	private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    		 
    	    public void onReceive(Context context, Intent intent) {
    	        String action = intent.getAction();
    	        if (ACTION_USB_PERMISSION.equals(action)) {
    	            synchronized (this) {
    	                accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
    
    	                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
    	                    if(accessory != null){
    	                        //call method to set up accessory communication
    	                    }
    	                }
    	                else {
    	                    Log.d(TAG, "permission denied for accessory " + accessory);
    	                }
    	            }
    	        }
    	    }
    	};
    //Fonction qui se lance lors de l'appui sur le bouton
    	public void envoiCommande(View view) {
    	    coucou.setText("Début connexion");
    		byte[] data = new byte[2];
    		data[0] = 1;
    		data[1] = 1;
    		UsbAccessory[] accessories = null;
    		
    		if(mUsbManager != null){
    			accessories = mUsbManager.getAccessoryList();
    			coucou.setText("accessories rempli !");
    			}
    		if(accessories != null){
    			accessory = accessories[0];
    			coucou.setText("accessory rempli !");
    			}
    		if(accessory != null){
    			mUsbManager.requestPermission(accessory, mPermissionIntent);
    
    			mFileDescriptor = mUsbManager.openAccessory(accessory);		//Le programme plante vers ici
    			if (mFileDescriptor != null) {
    				FileDescriptor fd = mFileDescriptor.getFileDescriptor();
    				mInputStream = new FileInputStream(fd);
    				mOutputStream = new FileOutputStream(fd);
    				Thread thread = new Thread(ecriture(), "AccessoryThread");	//Aucune idée de la validité de cette ligne
    				thread.start();
    			}
    	    }
    	}
    	
    	public Runnable ecriture() {
    		
    		return null;
    	}
    	
    	public static String getActionUsbPermission() {
    		return ACTION_USB_PERMISSION;
    	}
    
    }
    



    -
    Edité par m0ha 6 février 2013 à 16:34:04

    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2013 à 2:19:48

      Salut,

      J'ai eu l'occas de voir un gars de ma promo bosser la dessus, il a utilisé cette librairie la : http://code.google.com/p/microbridge/

      Je ne suis pas sur mais je crois que pour l'utiliser, cela nécessite de modifier "patcher" les sources Android et de recompiler le tout, uniquement possible sous systène linux et osx... et assez laborieux à vrai dire.

      • Partager sur Facebook
      • Partager sur Twitter
        12 février 2013 à 19:58:55

        Merci pour cette info mais j'ai trouvé une solution plus simple, il faut rajouter un test pour la permission "mUsbManager.hasPermission(accessory)" là où il me semblait que le programme plantait (ligne 96).
        J'ai maintenant un autre problème pour cette connexion. Elle fonctionne correctement sur un smartphone mais pas sur une tablette (c'est aussi le cas pour le programme de microchip). J'ai pour les tests deux tablettes récentes dont je ne connais pas les références : une 10 pouces d'asus et une 7 pouces de samsung. Si quelqu'un à une idée de pourquoi la connexion ne fonctionne pas sur ces tablettes, merci d'avance.

        Edit : Problème réglé ça venait de la carte

        -
        Edité par m0ha 19 février 2013 à 22:44:57

        • Partager sur Facebook
        • Partager sur Twitter
          2 avril 2013 à 16:54:20

          Bonjour M0ha je suis dans le meme cas que toi je voudrais savoir quelle condition as tu ajouter pour que le code fonctionne merci d'avance
          • Partager sur Facebook
          • Partager sur Twitter

          [Android] Programation d'une connexion USB

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown