いちおくまんえん

最近はcocos2d-xでゲームアプリ「いちおくまんえん」の制作がメインです。 あとアニメも少々・・

android.permission.READ_PHONE_STATEを削除する

AndroidManifest.xmlに指定する、
android.permission.READ_PHONE_STATEの削除についてです。

こいつが必要になってつける時は、だいたい端末の識別番号を取りたいとか、
電話番号取りたいとか、そういう目的でつけるのが一般的かなと思います。

本当にその情報が必要なアプリの場合はつけるしか無いですが、特に関係のないアプリで
このパーミッションを設定しているとユーザに、情報抜かれているのでは?と不審感を与えてしまいます。

なので、特に必要でない場合は付けるべきではないです。

自分の所の、今やってるプロジェクトは過去の黒歴史資産からの移植ものなので、
最初からついていたので、何故必要なのか分からないという所からスタート(;^ω^)

きっとゲームアプリなので、端末のデータがぶっ飛んだり、再インストールしなおしても
端末の識別番号が取れればそれをサーバに通知しておけば復旧させることが出来る。
といった目的で使用していたのかなと勝手に推測してその辺を追ってみる。

どうやらUUIDで初期ユーザIDで生成しているので違う模様。
そもそも再インストールとかデータ消去で初期化されるのであった∑(゚Д゚)

じゃあ要らないだろうとAndroidManifest.xmlから消してみる。

即落ちたw


スタックトレースを見るとTelephonyManagerのlistenで死んでる模様。

そもそも何してんねん。って追っかけてみると電話かかってきた時にBGMなりを止めたいらしい。

MediaPlayer使ってたら勝手に止まるのかもしれないですが、
うちのプロジェクトでは音声周りに専用ライブラリを使っているせいか、この辺りの処理を消すと
電話がかかっても鳴りっぱなし。そして通話が始まっても鳴りっぱなしw

まじで空気読めよwwwww

というわけで、電話の着信イベント拾いたいから必要なんです!とかで済まそうかと思ったけど
TelephonyManagerのインスタンスの取得や、着信状態の取得などはパーミッションがなくても使用できるようなので

以下の様な実装に変更して対応しました。

@Override
protected void onPause() {
    super.onPause();
    
    pauseSoundWithCallState();
}
   
/**
 * 現在の電話の状態を取得する
 * 何らかの理由で取得出来なかった場合は何もない状態(CALL_STATE_IDLE)を返す
 * @see TelephonyManager
 * @return
 */
private int getCallState() {
    TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    if (mgr != null) {
        return mgr.getCallState();
    }
    return TelephonyManager.CALL_STATE_IDLE;
}

/**
 * 電話がかかってきた時のonPauseでSoundを止めるためのもの
 * TelephonyManagerのlistenで監視する方法では
 * READ_PHONE_STATEのパーミッションが必要になる為、こういう実装になってます。
 */
private void pauseSoundWithCallState() {
    if (getCallState() != TelephonyManager.CALL_STATE_IDLE) {
        pauseSound();
    };
}


ふぅ、最近技術的なこと何も書いてなかったから、とりあえず書きましたなんてとても言えない(´ε`;)