Android 9 · 10에서 BroadcastReceiver를 사용하여 수신 번호를 얻지 못할 때의 메모

BroadcastReceiver를 사용하여 들어오는 번호를 얻는 것이 잘 작동하지 않았으므로 해결 방법을 작성합니다.

하고 싶은 일



전화가 걸릴 때 걸려온 번호를 얻고 싶습니다.

전화 상태 얻기 Receiver



먼저 검색하고 잘 쓰여진 코드로 시도했습니다.

Android.Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.callreceivetest">

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

※TextView는 전화번호를 표시하기 위해

MainActivity.java
    TextView callinfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        callinfo=findViewById(R.id.callinfo);

        //リスナー設定
        TelephonyManager telephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        telephonyManager.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);

    }

    PhoneStateListener mListener = new PhoneStateListener(){
        @Override
        public void onCallStateChanged(int state, String callNumber) {
            //Log.d(TAG, ":" + state+"-PhoneNumber:"+callNumber);
            switch(state){
                case TelephonyManager.CALL_STATE_IDLE:      //待ち受け(終了時)
                    Toast.makeText(MainActivity.this, "通話終了\nCALL_STATE_IDLE", Toast.LENGTH_SHORT).show();
                    break;
                case TelephonyManager.CALL_STATE_RINGING:   //着信*
                    if(callNumber==null){
                        callNumber="";
                    }
                    Toast.makeText(MainActivity.this, "着信中\nCALL_STATE_RINGING: " + callNumber, Toast.LENGTH_SHORT).show();
                    callinfo.setText("着信:"+callNumber);
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:   //通話
                    Toast.makeText(MainActivity.this, "通話中\nCALL_STATE_OFFHOOK", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

이 코드를 Android 10 에뮬레이터에서 실행하면 이미지와 같이 전화 상태를 얻을 수 있지만 전화 번호는 왜인지 얻을 수 없습니다.


전화번호를 얻을 수 없는 원인



Android9 · 10 (API 레벨 28 이상)부터 BroadcastReceiver를 사용하여 전화 번호를 얻는 데 필요한 권한이 변경된 것 같습니다.
참고 사이트: htps : //로 ゔぇぺぺr. 안 d로이 d. 코 m/아보 t/ゔぇr 시온 s/피에/안 d로이 d-9. 0-찬 s? hl = 그럼 # st ct t 어서 s-p
이번에는 onCallStateChanged()를 사용하여 취득하므로 READ_PHONE_STATE(전화) 외에 READ_CALL_LOG(통화 이력) 권한이 필요합니다.

그러나 Android Developers 사이트에는 READ_PHONE_STATE 권한이 필요하지 않습니다. (실제로 에뮬레이터로 확인했습니다)
따라서 모든 버전을 지원하려면 READ_PHONE_STATE와 READ_CALL_LOG의 두 가지 권한이 필요합니다.

수정 후



Android.Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.callreceivetest">

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CALL_LOG"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

'통화 내역' 권한으로 변경한 결과



Android10에서도 제대로 전화 번호를 얻을 수있었습니다!


참고 사이트



프로그램 : htps : //s와 ry 보아 rd. jp/bぉg/안 d로이 d_테l 마나게 r/

착신·통화중·통화 종료 이외의 상태를 취득하고 싶을 때는, 여기를 참고로 하면 알기 쉽습니다.
htps : // 코 m / 슈카이 / ms / d4911590 001d401 028

좋은 웹페이지 즐겨찾기