Android-IMEI & 전화번호 가져오기(권한 부여)

2 분 소요

Android 웹 뷰 예제

MainActivity.java

package com.imei_project.phonenum02;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Settings;
//import android.support.v7.app.AppCompatActivity;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private static String TAG = "휴대폰 정보 가져오기";
    private static final int PERMISSION_READ_STATE = 0; //false
    TextView textView;
    String device_unique_id,IMEI;

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

        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        /*
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            // Permission is not granted
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_READ_STATE);
        }
        */

        //AndroidManifest.xml에 READ_PHONE_STATE권한을 추가하여도 발생되는 권한문제를 해결하는 부분
        //권한이 없다면 팝업을 띄워서 권한을 부여한다
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) { //권한이 없다면 다음을 실행
            //shouldShowRequestPermissionRationale() 권한거부 true, false
            // 사용자가 이전에 요청을 거부한 경우 true를 반환하고
            // 사용자가 권한을 거부하고 권한요청 대화상자에서 다시 묻지 않음 옵션을 선택했거나 기기 정책상 이 권한을 금지하는 경우 false를 반환
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_PHONE_STATE)) {
            } else {//requestPermissions() 권한이 없을시 권한요청, 사용자에게 권한부여 대화상자표시
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},
                        PERMISSION_READ_STATE);
            }
        }

        /* 디바이스 ID가져오기, 고유 ID 가져오기
        else {
            TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
            IMEI = tm.getDeviceId();
            device_unique_id = Settings.Secure.getString(this.getContentResolver(),
                    Settings.Secure.ANDROID_ID);
            textView.setText(device_unique_id+"----"+tm.getDeviceId());
            // READ_PHONE_STATE permission is already been granted.
            Toast.makeText(this,"Alredy granted",Toast.LENGTH_SHORT).show(); //Toast.makeText 메시지 띄우기, 레이아웃도 설정해야된다

            Log.i(TAG, "============ 디바이스 정보 추출============");
            Log.d(TAG, "IMEI : >>> "+IMEI);
            Log.d(TAG, "device_unique_id : >>> "+device_unique_id);
        }
        */

        Log.i(TAG, "============ 디바이스 정보 가져오기============");
        Log.d(TAG, "음성통화 상태       : [ getCallState ]           >>> "+tm.getCallState());
        Log.d(TAG, "데이터통신 상태     : [ getDataState ]           >>> "+tm.getDataState());
        Log.d(TAG, "디바이스 아이디     : [ getDeviceId ]            >>> "+tm.getDeviceId());
        Log.d(TAG, "통신사 ISO 국가코드 : [ getNetworkCountryIso ]   >>> "+tm.getNetworkCountryIso());
        Log.d(TAG, "통신사 ISO 국가코드 : [ getSimCountryIso ]       >>> "+tm.getSimCountryIso());
        Log.d(TAG, "망사업자 MCC+MNC    : [ getNetworkOperator ]     >>> "+tm.getNetworkOperator());
        Log.d(TAG, "망사업자 MCC+MNC    : [ getSimOperator ]         >>> "+tm.getSimOperator());
        Log.d(TAG, "망사업자명          : [ getNetworkOperatorName ] >>> "+tm.getNetworkOperatorName());
        Log.d(TAG, "망사업자명          : [ getSimOperatorName ]     >>> "+tm.getSimOperatorName());
        Log.d(TAG, "SIM 카드 상태       : [ getSimState ]            >>> "+tm.getSimState());

        //Log.d(TAG, "전화번호 :" + tm.getLine1Number());
        Log.d(TAG, "전화번호            : [ getLine1Number ]         >>> "+getPhone()); //전화번호
        String android_id = Settings.Secure.getString(this.getContentResolver(),Settings.Secure.ANDROID_ID);
        Log.d(TAG, "IMEI 단말기고유번호 : [ android_id ]             >>> "+android_id); //IMEI 단말기 고유번호

    }

    //Phone 번호 가져오기 메소드
    //권한이 없으면 종료되는 에러를 방지하기위해 추가하였음
    //READ_PHONE_STATE 권한
    private String getPhone() {
        TelephonyManager phoneMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "READ_PHONE_STATE 권한이 없음");
            return "";
        }
        /*
        else(phoneMgr.getLine1Number().startsWith("+82"))// 국제번호(+82 10...)로 되어 있을경우 010 으로 변환
        {
            phoneNum = phoneMgr.getLine1Number().replace("+82", "0");
        }*/
        Log.d(TAG, "READ_PHONE_STATE 권한이 있음");
        return phoneMgr.getLine1Number();
    }
}
``

## AndroidManifest.xml
단말기 정보를 가져오기 위한 permission

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

권한 부여 조건문 추가하기 전 발생되었던 에러 (chekPermission)

call requires permission which may be rejected by user: code should explicityly check to see if permission is availabe (with chekPermission) or explicityly handle a potential securityExcept this check scans through your code and libraries and looks at the APIs being used, and checks this against the set of permission required to access those APIs. If the code using those APIs is called at runtime, then the program will crash.

futhermore, for permissions that are revocable (with targetSdkVersion 23), clien code must also be prepared to handle the calls throwing an exception if the user rejects the request for permission at runtime.

Issue id: MissingPermission

태그:

카테고리:

업데이트:

댓글남기기