Androidアプリ開発

USBデバイスの権限チェックと
ユーザ承認リクエスト

この記事は約10分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


USBデバイスの権限チェックとユーザ承認リクエストを発行する

GPS位置情報中継アプリ(MLS)では、USBデバイス接続時に権限チェックとユーザ承認リクエストを発行しています。
権限がないデバイスは、使用(アクセス)できません。

安価なGPSレシーバーですが、MLSを使えば更新レート10Hzで動作させることが可能です。

ポイント

GPSレシーバなどのUSBデバイスを使用する場合、権限チェックとユーザ承認が必要です。
これはアプリに対して、接続したUSBデバイスに使用(アクセス)を許可するかという意味合いで、USBデバイスの接続自体やデバイス名などのメタ情報の取得には権限は不要です。
今回は、USBデバイスを使用する際の権限チェックとユーザ承認リクエストの実装を紹介します。

実行時の権限をリクエストする

USBデバイスの権限チェックとユーザ承認リクエストを発行する

USBデバイスに接続する場合、UsbManagerを使用します。
UsbManagerのデバイスリストから、接続するUSBデバイスを取得します。
権限チェックはhasPermissionで行い、falseの場合にユーザ承認リクエストを発行します。
承認リクエストの結果確認は、BroadcastReceiverで行います。

    private static final String ACTION_USB_PERMISSION = "com.jiseifirm.mls.service.LocationService.USB_PERMISSION";
    private UsbManager usbManager;
    private UsbDevice  device;
  :

    // 承認リクエストの結果確認
    private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            if (ACTION_USB_PERMISSION.equals(intent.getAction())) {
                synchronized (this) {
                    unregisterReceiver(usbReceiver);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        // OKの場合の処理
                        :
                    } else {
                        // キャンセルの場合の処理
                        :
                    }
                }
            }
        }
    }
    :

  // USBデバイスの権限チェックとユーザ承認リクエスト発行
	usbManager = (UsbManager) context.getSystemService(Service.USB_SERVICE);
    // 接続するUSBデバイスのベンダーID(vender)とプロダクトID(product)
    device = attachedDevice(vender, product);
	if (device != null) {
    	if (usbManager.hasPermission(device)) {
        	// 権限ありの場合の処理
        	:
    	} else {
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION).setPackage(getPackageName()), PendingIntent.FLAG_MUTABLE);
        	IntentFilter intentFilter = new IntentFilter(ACTION_USB_PERMISSION);
        	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            	registerReceiver(usbReceiver, intentFilter, RECEIVER_EXPORTED);
        	} else {
            	registerReceiver(usbReceiver, intentFilter);
        	}
        	usbManager.requestPermission(device, pendingIntent);
    	}
    :

    // USBデバイスの取得
    private UsbDevice attachedDevice(int vender, int product) {
        try {
            for (UsbDevice usbDevice : usbManager.getDeviceList().values()) {
                if (usbDevice.getVendorId() == vender & usbDevice.getProductId() == product) {
                    return usbDevice;
                }
            }
        } catch (Exception e) {
            // エラー処理
            :
        }
        return null;
    }
    :

UsbManagerのデバイスリスト(getDeviceList)から、ベンダーID(getVendorId)とプロダクトID(getProductId)が接続するデバイスと一致するデバイスを取得しています。
権限がない場合、PendingIntentintentFilterの生成、結果を受け取るBroadcastReceiverを登録します。
注意点として、PendingIntent生成時にFLAG_MUTABLEを指定しないと、Intentに結果がセットされません。
また、Android14以降ではIntentにパッケージ名を指定しないとFLAG_MUTABLEを作成できなくなっています。
setPackageでパッケージ名を指定する必要があります。
Intentのアクション(getAction)は取得できるので、hasPermissionで再チェックする実装でも問題ないと思います。

今回は、ここまでです。

USBデバイスの権限チェックとユーザ承認リクエストを発行しているAndroidアプリです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちらから、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。
オンラインスクールでの習得を、強くおススメします。

未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪

未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポッとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

タイトルとURLをコピーしました