web-dev-qa-db-ja.com

USBデバイスアクセスポップアップの抑制?

USBデバイスがAndroidタブレットに接続されると、ユーザーの許可を求めるポップアップが表示されます。クライアントがそれを望まないので、これを抑制したいと思います。 ?

コード内:

UsbManager.requestpermission(); 

uSBデバイスに一時的なアクセスを与えるために呼び出されます。

これにより、ポップアップがスローされます。デフォルトでポップアップを非表示にしたり、ユーザーにアクセスを許可したりするにはどうすればよいですか?

46
venkat

アプリ内で許可をリクエストすると、「この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>

ここで、vendor-idとproduct-idは10進数で指定する必要があります-上記のVIDとPIDは両方とも0x6666です。

上記で指定したことは、USBアクセサリでも機能します(つまり、アクセサリはUSBホストで、Androidはデバイス))-その場合、intent-filterは登録する必要があります

<action Android:name="Android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />

また、まったく同じ方法でメタデータフィルターを含める必要があります。

http://developer.Android.com/guide/topics/connectivity/usb/accessory.html を参照し、「インテントフィルターの使用」セクションを検索してください。

[〜#〜] edit [〜#〜]

結論として、アクティビティに対してインテントフィルターを登録すると、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 translucentテーマ)-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>  
88
Wayne Uroda