こんにちは、まっさん(@Tera_Msaki)です。
この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、記事の最後で紹介します)
Android11以前に開発したアプリは、SdkVersionをAndroid12にするだけでは、Bluetoothが使用できません。
その理由は、Android12で新しい Bluetooth 権限が導入されているからです。
Bluetoothを使用するアプリのAndroid12対応
◎ポイント
Android11以前は、マニフェストファイル(AndroidManifest.xml)に権限を指定するだけで、Bluetoothデバイスを使用できました。
Android12では、Bluetoothデバイスを探す、デバイスを他のデバイスから検出可能にする、ペア設定されているBluetoothデバイスと通信する場合は、アプリ側でユーザー承認をリクエストする必要があります。
◎マニフェストファイルに権限を指定する
マニフェストファイル(AndroidManifest.xml)に権限(uses-permission)を指定します。
Bluetoothデバイスを探す、ペア設定されているBluetoothデバイスと通信する権限を追加します。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="...">
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" tools:targetApi="s" />
:
BLUETOOTHとBLUETOOTH_ADMINは、maxSdkVersion属性を指定して、Android11(API レベル30)以前の場合に使用するようにします。
Bluetoothデバイスを使用して物理的な位置情報を取得しない場合は、BLUETOOTH_SCANのusesPermissionFlags属性にneverForLocationを指定します。
◎権限をチェックする
Android11(APIレベル30)より新しいバージョンの場合、BLUETOOTH_SCANとBLUETOOTH_CONNECTが許可( PERMISSION_GRANTED)でない場合、ユーザー承認をリクエストします。
private static final int REQUEST_MULTI_PERMISSIONS = 101;
:
private void checkPermissions() {
ArrayList<String> requestPermissions = new ArrayList<>();
//Bluetooth
if(Build.VERSION.SDK_INT > 30) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
requestPermissions.add(Manifest.permission.BLUETOOTH_CONNECT);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) {
requestPermissions.add(Manifest.permission.BLUETOOTH_SCAN);
}
}
:
if (!requestPermissions.isEmpty()) {
ActivityCompat.requestPermissions(this, requestPermissions.toArray(new String[0]), REQUEST_MULTI_PERMISSIONS);
} else {
:
}
}
◎ユーザ承認のリクエスト画面
◎ユーザー承認結果を確認する
ユーザー承認の結果を確認し、許可(PERMISSION_GRANTED)でない場合は、処理を継続できないよう制御します。
private boolean start = true;
:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_MULTI_PERMISSIONS) {
if (grantResults.length > 0) {
for (int i = 0; i < permissions.length; i++) {
switch (permissions[i]) {
case Manifest.permission.BLUETOOTH_CONNECT:
case Manifest.permission.BLUETOOTH_SCAN:
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
start = false;
:
}
break;
:
default:
}
}
}
}
if (start) {
:
} else {
button.setVisibility(View.VISIBLE);
}
}
ボタンを非表示にすることで、処理を継続できないようにしています。
今回は、ここまでです。
Android12のBluetooth権限に対応した Androidアプリです↓↓↓
Android13対応(画像・動画・音声ファイルのメディア権限)はこちらです↓↓↓
SwitchBot 温湿度計は、
湿度と温度をBluetooth経由で取得できます♪
広告パケットに湿度と温度が含まれているため、
ペアリングなしで取得できます。
これ、内緒だよ(^^♪)
誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にあるコメントか、
こちらから、お願いいたします♪
ポチッとして頂けると、
次のコンテンツを作成する励みになります♪