2016-12-30 2 views
1

У меня есть приложение, которое использует проприетарное устройство USB (андроид в режиме хоста).Android Usb Host, singleInstance, onCreate продолжает получать вызовы с USB-подключением

У меня есть BroadcastReceiver, который я зарегистрироваться в конструкторе

// this block is in the constructor 
usbConnectionReceiver = new UsbConnectionReceiver(); 
IntentFilter filter = new IntentFilter(); 
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); 
context.registerReceiver(usbConnectionReceiver, filter); 



public class UsbConnectionReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { 
      UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
      if (device != null) onDeviceAttached(device); 
     } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { 
      UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
      if (device != null) onDeviceDetached(device); 
     } 
    } 
} 

public void onDeviceAttached(UsbDevice device) { 
    usbDevice = device; 
    intf = usbDevice.getInterface(0); 
    endpoint = intf.getEndpoint(0); 
    if (usbManager.hasPermission(usbDevice)) { 
     usbDeviceConnection = usbManager.openDevice(usbDevice); 
     boolean status = usbDeviceConnection.claimInterface(intf, true); 
     if (status) { 
      startPollingThread(); 
     } 
    } else { 
     // I used to have code here that would programmatically prompt for permissions. 
    } 
} 

Все прекрасно работает, за исключением того, что каждый раз, когда устройство отключил и снова, конечный пользователь должен ввести разрешения. Флажок «Использовать по умолчанию для этого устройства USB» полностью игнорируется.

После некоторых исследований выяснилось, что если я прошу разрешения через код, это действительно так.

Поэтому я переключил свою деятельность на использование фильтра намерений. Я больше не получаю окно разрешений после первого раза, поэтому флажок работает. Вместо этого, каждый раз, когда устройство повторно подключается, он вызывает onCreate() моего приложения, разбивая его.

У меня есть launchMode="singleInstance" (на самом деле, я перепробовал все сорта), и в то время как приложение и работает, и сверху на экране, то onCreate() вызывается вместо onNewIntent() (который документация, кажется, предположить, должно бывает).

Я также читал, что мне нужно установить android:launchMode="singleInstance" Я также прочитал мне нужно установить android:taskAffinity=""

Все безрезультатно. Я знаю, что есть много подобных сообщений, но никто из них, похоже, не работает. Любые советы приветствуются.

Вот мой AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.me.myapp" > 
    <application 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" 
     android:launchMode="singleInstance" > 
     <activity 
      android:name=".MainActivity" 
      android:taskAffinity="" 
      android:label="@string/app_name" 
      android:configChanges="keyboard" > 
      <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" /> 
      </intent-filter> 
      <meta-data 
       android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
       android:resource="@xml/device_filter" /> 
     </activity> 
    </application> 
</manifest> 

ответ

0

Я считаю, что это самое лучшее решение ... если кто-то комментарий, я хотел бы услышать это, потому что обращение Usb в андроида всегда была головная боль!

Я использовал этот пост в качестве ссылки USB device access pop-up supression?

Я создал следующую активность

public class UsbActivity extends Activity { 
    private static final String TAG = "UsbActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     Intent intent = getIntent(); 
     if (intent != null) 
     { 
      if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) 
      { 
       Logger.lc(TAG,"ACTION_USB_DEVICE_ATTACHED"); 
       UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
       Logger.lc(TAG,"UsbDevice"); 
       UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
       Logger.lc(TAG,"UsbManager"); 
       if (usbDevice != null && usbManager != null && !usbManager.hasPermission(usbDevice)) { 
        Logger.lc(TAG,"openDevice"); 
        usbManager.openDevice(usbDevice); 
       } 
      } 
     } 
     finish(); 
    } 
} 

И добавил его манифеста

<activity 
     android:name="com.myapp.UsbActivity" 
     android:label="MyApp" 
     android:theme="@style/Theme.Transparent" 
     android:noHistory="true" 
     android:excludeFromRecents="true" 
     android:taskAffinity="com.myapp.taskAffinityUsbReceiver" 
     android:process=":UsbEventReceiverActivityProcess" 
     android:exported="false" > 
     <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> 

со следующим style.xml

<style name="Theme.Transparent" parent="android:Theme"> 
     <item name="android:windowIsTranslucent">true</item> 
     <item name="android:windowBackground">@android:color/transparent</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:windowNoTitle">true</item> 
     <item name="android:windowIsFloating">true</item> 
     <item name="android:backgroundDimEnabled">false</item> 
     <item name="android:windowAnimationStyle">@null</item> 
    </style> 
Смежные вопросы