47

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

コード内:

UsbManager.requestpermission(); 

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

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

4

2 に答える 2

102

アプリ内で許可を要求すると、「この 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>

res/xml/usb_device_filter などの xml リソースにフィルター ファイルを作成する必要もあります。

<?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を参照して、「インテント フィルタの使用」セクションを検索してください。

編集

結論として、アクティビティに対してインテント フィルターを登録すると、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>  
于 2013-03-01T05:22:48.547 に答える