เมื่อคุณขออนุญาตภายในแอปของคุณ ดูเหมือนว่าช่องทำเครื่องหมาย "ใช้เป็นค่าเริ่มต้นสำหรับอุปกรณ์ 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 และ Android เป็นอุปกรณ์) - ในกรณีนั้นตัวกรองเจตนาควรลงทะเบียน
<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>
person
Wayne Uroda
schedule
01.03.2013