Partage
  • Partager sur Facebook
  • Partager sur Twitter

Android/Usb Hôst - détection d'un accessoire

mon appli détecte la déco mais pas la co

    17 février 2013 à 15:56:31

    Bonjour à tous

    Je sollicite votre aide pour un problème pas banal car je cherche à faire en sorte que mon appli détecte l'ajout d'un périphérique. En connectant mon lecteur (de cartes à puces), je vois bien la petite fenêtre s'ouvrir me demandant quelle appli je veux utiliser avec ce périphérique, mais mon appli, elle n'a pas l'air de recevoir l’événement. Or pourtant, elle reçoit bien l’événement de déconnexion, comme en témoigne le petit screenshot ci-joint :waw: (effectué après plusieurs insertions / retraits). Navré pour la couleur des logs, ils ne sont pas très lisibles, et j'ai oublié un espace avant le VID:PID.

    Screenshot

    Voici donc le petit bout de code, et si quelqu'un comprend pourquoi je détecte le retrait mais pas l'ajout, ça m'intéresse :p

    Parce que là, à l'ajout ça ne log absolument rien

    Donc l'activité pour commencer

    package com.example.testsc;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.hardware.usb.UsbManager;
    import android.hardware.usb.UsbDevice;
    import android.hardware.usb.* ;
    
    
    import android.widget.TextView;
    import android.graphics.Rect;
    
    
    
    public class MainActivity extends Activity
    {
    	private TextView mLog ;
    	private UsbManager manager ;
    
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		mLog = (TextView) findViewById (R.id.log) ;
    		manager = (UsbManager) getSystemService (Context.USB_SERVICE) ;
    		
    		IntentFilter filter = new IntentFilter();
    		filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
    		filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
    		registerReceiver(mUsbReceiver, filter);
    	}
    
    	BroadcastReceiver mUsbReceiver = new BroadcastReceiver ()
    	{
    		public void onReceive (Context context, Intent intent)
    		{
    			String action = intent.getAction() ;
    			appendLog ("Réception d'un évènement : " + action) ;
    			
    if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); appendLog ("Ajout du périphérique " + device.getDeviceName()) ; String s = "VID:PID=" + device.getVendorId() + ":" + device.getProductId() ; appendLog (s) ; } if (action.equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) ; appendLog ("Retrait du périphérique " + device.getDeviceName() + device.getVendorId() + ":" + device.getProductId()) ; } } } ; private void appendLog(String text) { // Code ... } }

    Le manifeste

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.testsc"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-feature android:name="android.hardware.usb.host" />
        <uses-sdk
            android:minSdkVersion="12"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.testsc.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                 </intent-filter>
                <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                    android:resource="@xml/device_filter" />
            </activity>
        </application>
    
    </manifest>

    et enfin la ressource pour filtrer les périphériques

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!-- classe 11 = lecteurs de cartes à puces -->
        <usb-device class="11" subclass="0" protocol="0" />
    </resources>
    

    Par ailleurs, est-ce que quelqu'un saurait m'expliquer pourquoi ce code, lorsque je branche mon lecteur, me crée une nouvelle activité, au lieu de réutiliser celle déjà existante (en la faisant remonter le cas échéant) ?

    Merci d'avance pour votre aide


    • Partager sur Facebook
    • Partager sur Twitter

    Android/Usb Hôst - détection d'un accessoire

    × 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