中安拓也のブログ

プログラミングについて書くブログ

【障害メモ】[Ionic v3][Android]電話の発信と管理を許可しないとDevice Idを取得できない

f:id:l08084:20200222203852p:plain
電話の発信と管理の許可についてのモーダル

障害内容

Ionic v3で作成されたAndroidアプリで、「電話の発信と管理を許可しますか?」と表示されるモーダルで「許可しない」を選択したユーザーの、端末識別ID(Unique Device ID)を取得できないエラーが発生した。

環境

  • cordova (Cordova CLI) : 8.0.0
  • Ionic Framework : ionic-angular 3.9.5
  • Android 9.0

原因

端末識別ID(Unique Device ID)を取得するのに使用しているCordovaプラグインであるUniqueDeviceIDが、電話の発信と管理を許可していないユーザーに対応していないのが原因となる。電話の発信と管理を許可していないユーザーの端末からDevice IDを取得できないため、下記のエラーを出力してDevice IDの取得に失敗する。

app.js:1 Exception occurred: getDeviceId: uid 10192 does not have android.permission.READ_PHONE_STATE.

エラーが発生した箇所

電話の発信と管理を許可していないユーザーの場合は、Device IDの取得に失敗するためthis.uniqueDeviceID.get()の部分で上記のエラーが発生する。

import { UniqueDeviceID } from '@ionic-native/unique-device-id';

@Injectable()
export class DeviceIdGetService {
    private deviceId: string;

    constructor(private uniqueDeviceID: UniqueDeviceID, private platform: Platform) {
        this.deviceId = '';
    }

    public init() {
        if (this.platform.is('cordova')) {
   // 電話の発信と管理を許可していない場合は、DeviceIdを取得できない
            this.uniqueDeviceID.get()
                .then((uuid: any) => {
                    this.deviceId = this.getPlatformPrefix().concat(uuid);
                })
                .catch((error: any) => {
                    console.log(error);
                });
        } else {
            this.deviceId = 'Browser';
        }
    }
}

対応方針

アプリによる電話の発信と管理を許可するようにユーザーに強制することはできないため、device idの取得に失敗してもアプリを利用できるようにするか、電話の発信と管理を許可していないユーザーを検知して、許可を促すメッセージを表示するしかない。