Подавление всплывающих окон доступа к USB-устройству?
Когда USB-устройство подключено к планшету Android, появляется всплывающее окно с запросом разрешения пользователя. Я хочу подавить это, поскольку клиент не хочет этого. Как я должен идти об этом?
В коде:
UsbManager.requestpermission();
вызывается, чтобы дать устройству USB временный доступ.
Это бросает всплывающее окно. Как отключить всплывающее окно или предоставить доступ пользователю по умолчанию?
1 ответ
Когда вы запрашиваете разрешение внутри вашего приложения, кажется, что флажок "использовать по умолчанию для этого USB-устройства" ничего не делает (я не уверен, почему этот флажок вообще появляется в этом всплывающем окне).
Вместо этого вы должны зарегистрировать обработчик намерений для вашей деятельности в манифесте:
<activity
...
...
>
<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/usb_device_filter" />
</activity>
Вы также должны создать файл фильтра в своих ресурсах xml, например, res / xml / usb_device_filter:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="26214" product-id="26214" />
</resources>
Идентификатор вендора и идентификатор продукта здесь должны быть указаны в десятичном виде - выше VID и PID равны 0x6666.
То, что я привел выше, также работает для аксессуара USB (то есть, где аксессуар является хостом USB, а андроид является устройством) - в этом случае фильтр намерений должен регистрироваться
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
и вы также должны включить фильтр метаданных точно таким же образом.
См. http://developer.android.com/guide/topics/connectivity/usb/accessory.html и найдите раздел "Использование фильтра намерений".
РЕДАКТИРОВАТЬ
В заключение - если вы зарегистрируете фильтр намерений в зависимости от своей активности, окно разрешений USB будет отображено сразу после подключения USB-устройства / аксессуара. Если пользователь установит флажок "использовать по умолчанию для этого USB-устройства", а затем предоставит разрешение, оно будет запомнено, и диалоговое окно разрешения не будет отображаться снова (если только приложение не удалено или пользователь не удаляет действие по умолчанию из диспетчера приложений).).
Я поместил здесь крошечный, ужасный, работающий пример проекта:
http://www.locusia.com/examples/permissionTest.zip
Вам нужно будет отредактировать файл res / xml / usb_device_filter.xml, но в противном случае это позволит вам очень быстро его протестировать.
За услуги...
Кажется, что служба не может получить намерения USB. Я обошел это, сделав скрытую деятельность, которая затем повторно передаст намерения.
Я определяю это в моем манифесте так:
<activity
android:name=".activities.UsbEventReceiverActivity"
android:label="YOUR APPLICATION NAME - This appears in the permission popup"
android:theme="@style/Theme.Transparent"
android:noHistory="true"
android:excludeFromRecents="true"
android:taskAffinity="com.example.taskAffinityUsbEventReceiver"
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/usb_device_filter" />
</activity>
(У меня есть сложная схема задачи / процесса в моем сервисе, YMMV в этой области).
Я определил деятельность так:
public class UsbEventReceiverActivity extends Activity
{
public static final String ACTION_USB_DEVICE_ATTACHED = "com.example.ACTION_USB_DEVICE_ATTACHED";
@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))
{
Parcelable usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
// Create a new intent and put the usb device in as an extra
Intent broadcastIntent = new Intent(ACTION_USB_DEVICE_ATTACHED);
broadcastIntent.putExtra(UsbManager.EXTRA_DEVICE, usbDevice);
// Broadcast this event so we can receive it
sendBroadcast(broadcastIntent);
}
}
// Close the activity
finish();
}
}
И последний кусок головоломки, прозрачная тема (я не уверен, но вы, вероятно, могли бы использовать встроенную полупрозрачную тему для Android) - res/values /styles.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<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>
</resources>
Поздно, но я надеюсь помочь. Официальная документация по Android говорит: "Когда пользователи подключают устройство, которое соответствует вашему фильтру устройств, система представляет им диалоговое окно, в котором спрашивается, хотят ли они запустить ваше приложение. Если пользователи соглашаются, ваше приложение автоматически получает разрешение на доступ к устройству, пока устройство не будет отключен. ". Если вы также установите флажок для запоминания устройства, разрешение предоставляется до тех пор, пока приложение не будет удалено или данные не будут удалены через диспетчер приложений.
Итак, вы должны сделать:
- Добавьте фильтр намерений, как говорит Уэйн(и удалите все о разрешениях в вашей основной деятельности).
- Установите приложение и ЗАКРЫТЬ.
- Отключите и подключите USB.
- Примите разрешение и установите флажок, чтобы запомнить устройство.
- Наслаждаться.