본문 바로가기
Android

Android 전화번호 가져오려면 권한이 필요합니다.

by xavi2019 2020. 7. 17.

 

안드로이드도 권한 강화가 점점 됩니다.

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

    private void usimCheck() {
        TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        if (mTelephonyManager == null) {
            Toast.makeText(this, "전화번호를 가져올 수 없습니다.", Toast.LENGTH_LONG).show();
        } else {
            try {
                int simState = mTelephonyManager.getSimState();
                switch (simState) {
                    // 유심 상태를 알 수 없는 경우
                    case TelephonyManager.SIM_STATE_UNKNOWN:
                        // 유심이 없는 경우
                    case TelephonyManager.SIM_STATE_ABSENT:
                        // 유심 오류, 영구적인 사용 중지 상태
                    case TelephonyManager.SIM_STATE_PERM_DISABLED:
                        // 유심이 있지만 오류 상태인 경우
                    case TelephonyManager.SIM_STATE_CARD_IO_ERROR:
                        // 유심이 있지만 통신사 제한으로 사용 불가
                    case TelephonyManager.SIM_STATE_CARD_RESTRICTED:
                        Toast.makeText(this, "단말기의 유심이 존재하지 않거나 오류가 있는 경우, 앱을 사용할 수 없습니다.", Toast.LENGTH_LONG).show();
                        break;
                    default:
                        if ( ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED ) {
                            // TODO: Consider calling
                            //    ActivityCompat#requestPermissions
                            // here to request the missing permissions, and then overriding
                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                            //                                          int[] grantResults)
                            // to handle the case where the user grants the permission. See the documentation
                            // for ActivityCompat#requestPermissions for more details.

                            Toast.makeText(this, "전화번호를 가져오는 권한이 없습니다." + Build.VERSION_CODES.O, Toast.LENGTH_LONG).show();
                            // requestPermissions();

                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                ActivityCompat.requestPermissions(MainActivity.this,
                                        new String[]{ Manifest.permission.READ_PHONE_NUMBERS },
                                        MY_PERMISSIONS_REQUEST_READ_PHONE_NUMBERS);
                            }

                            return;
                        } else {

                            TelephonyManager phoneMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                            Log.d(TAG, "phoneMgr.getLine1Number(): " + phoneMgr.getLine1Number());
                        }
                        break;
                }
            } catch (Exception e) {
                Toast.makeText(this, "단말기의 정보를 가져오는 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요.", Toast.LENGTH_LONG).show();
                Log.e("simCheck", "Exception: " + e.toString());
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_NUMBERS) {
            if (grantResults.length > 0) {
                for (int i = 0; i < grantResults.length; ++i) {
                    if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                        // 하나라도 거부한다면.
                        new AlertDialog.Builder(this).setTitle("알림").setMessage("권한을 허용해주셔야 앱을 이용할 수 있습니다.")
                                .setPositiveButton("종료", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.dismiss();
                                        finish();
                                    }
                                }).setNegativeButton("권한 설정", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                                        .setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
                                getApplicationContext().startActivity(intent);
                            }
                        }).setCancelable(false).show();

                        return;
                    }
                }

            }
        }
    }

댓글