Saat Anda meminta izin di dalam aplikasi Anda, tampaknya kotak centang "gunakan secara default untuk perangkat USB ini" tidak melakukan apa pun (saya tidak yakin mengapa kotak centang ini muncul di munculan ini.
Sebagai gantinya, Anda harus mendaftarkan pengendali maksud untuk aktivitas Anda di manifes:
<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>
Anda juga harus membuat file filter di sumber daya xml Anda, misalnya res/xml/usb_device_filter:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="26214" product-id="26214" />
</resources>
Vendor-id dan product-id di sini harus diberikan dalam desimal - di atas VID dan PID adalah 0x6666.
Apa yang saya berikan di atas juga berfungsi untuk aksesori USB (yaitu, aksesori adalah host USB dan Android adalah perangkatnya) - dalam hal ini filter maksud harus didaftarkan
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
dan Anda juga harus memasukkan filter meta data dengan cara yang persis sama.
Lihat http://developer.android.com/guide/topics/connectivity/usb/accessory.html dan cari bagian "Menggunakan filter maksud".
EDIT
Kesimpulannya - jika Anda mendaftarkan filter maksud terhadap aktivitas Anda, jendela izin USB akan segera ditampilkan saat perangkat/aksesori USB terhubung. Jika pengguna mencentang kotak "gunakan secara default untuk perangkat USB ini" lalu memberikan izin, hal ini akan diingat dan dialog izin tidak akan ditampilkan lagi (kecuali aplikasi dihapus instalasinya atau pengguna menghapus tindakan default dari manajer aplikasi ).
Saya telah membuat proyek contoh kecil, buruk, dan berfungsi di sini:
http://www.locusia.com/examples/permissionTest.zip
Anda perlu mengedit res/xml/usb_device_filter.xml, namun jika tidak, ini akan memungkinkan Anda mengujinya dengan sangat cepat.
Untuk layanan...
Tampaknya suatu layanan tidak dapat menerima maksud USB. Saya menyiasatinya dengan membuat aktivitas tersembunyi yang kemudian menyiarkan ulang maksudnya.
Saya mendefinisikannya dalam manifes saya seperti ini:
<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>
(Saya memiliki tata letak tugas/proses yang kompleks di layanan saya, YMMV di area itu).
Saya mendefinisikan aktivitas seperti ini:
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();
}
}
Dan bagian terakhir dari teka-teki, tema transparan (saya tidak yakin tetapi Anda mungkin bisa menggunakan tema tembus pandang bawaan 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