본문 바로가기
Android/Develop

[Android] TextView에 적힌 번호로 전화걸기(권한 요청까지)

by hyun's life_developer 2019. 7. 5.

 

안녕하세요! 초보개발자 시아아빠입니다.

이번 포스팅의 주제는 TextView에 적힌 번호로 전화를 걸어볼거에요!

 

먼저 목적 순서에따라 설명을 하고 정리를 한 번 해볼까해요~!

 

우선...

전화를 걸어야 해요!! 그럼 우선 번호를 01012341234로 가정하겠습니다.

ex1)

String tel = "tel:01012341234"  //*point1
startActivity(new Intent("android.intent.action.CALL", Uri.parse(tel)));  //*point2
startActivity(new Intent("android.intent.action.DIAL", Uri.parse(tel)));  //*point3

 

*point1 !!

Intent에 Uri.parse해서 데이터를 넣는데요! 이때 번호 앞에 "tel:" 붙어줘야합니다.

입력 받는 데이터가 그냥 010xxxxxxxx라는 형식이고, 이때 call이라 가정하면!

ex2)

if (!call.startsWith("tel:"))
{
	call = "tel:" + call;
}

이런식으로요!! 강제로 붙여줘야 합니다~!  //확실한 정보는 아니나 제가 실행했을 때는 그러더라구요....

                                                                                  만약 사실이 아닐시 댓글에 수정요청 부탁드려요 ㅠㅠ

 

 

*point2 와 *point3 !!

"android.intent.action.CALL"과 "android.intent.action.DIAL"

두개 다 전화를 걸게 해주는 데요!!

 

차이점이 뭐다냐?! 바로!

CALL은 바로 다이렉트로 연결해주고! DIAL은 다이얼로그를 한 번 띄워준다는 점~~

 


 

자 전화걸 준비는 다 되었는데요~ 이것만으로 전화가 걸리지는 않겠죠?? ㅎㅎ

그 다음에는 권한체크와 요청을 할거에요

 

권한체크 중에서도 제일 먼저 해줘야하는 게 있는데요!

Manifest.xml에 permission을 설정해줘야해요

(사실 프로젝트 개발 시 제일 먼저 해줘야하는 부분)

 

 

1. 권한 설정

자 설정은 Manifest.xml에 

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

 

 

요로케 넣어주시면 끝....;;;ㅋㅋㅋㅋㅋ.... 어이없을 정도로 간단하죠?

 

자 끝났어요! ㅋㅋㅋㅋ ex1)처럼 Intent에 넣어 실행해주시면 됩니다~!! ㅎㅎ

 


 

그런데도 안되신다구요?? 자 그럼 권한체크를 해볼게요!

            (다른 프로젝트에서 따와서 새로 만드시는 분들 중에는 지금까지의 내용으로 되시는 분들이 계실수도 있어요!)

 

2. 권한 확인

 

권한 확인 방법은 ContextCompat.checkSelfPermission()메서드를 사용합니다!

 

ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE);

int permissionCheck = ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE); 

이렇게 변수에 넣어서 사용하셔두 되는데 저는 사용하지 않아도 작동시킬 수 있는 상황이라 변수에 넣지는 않았어요!

 

앱에 권한이 있는 경우에 이 메서드는 PackageManager.PERMISSION_GRANTED를 반환하고!

                      없는 경우에는                     PERMISSION_DENIED를 반환해요!

 

이제 권한 요청만 남았어요!

 

3. 권한 요청

 

사용자에게 권한을 요청할 때는 그 이유를 설명해줘야 해요!! (이유는 다 아실거에요~)

 

그럴땐!! shouldShowRequestPermissionRationale()메서드를 사용합니당~!

사용자가 거부를 하면 얘는 true를 던져줘용~~

 

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE != PackageManager.PERMISSION_GRANTED)
{
	if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE))
    {
    	
    }
    else
    {
    	ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
    }
}

앱에 권한이 없으면 requestPermissions()을 호출해서 권한 요청을 하고!!

사용자가 응답한 후에 결과를 가지고 콜백 메서드를 호출합니당!


쉽게 설명하면!! 첫째가 라면(앱에 권한)이 없을때! 둘째한테 라면을 끓여오라고 시킵니다!!

둘째 : 셋째야! 라면 끓여와!!  나 이거(requestPermissions()) 있어!!

셋째 : (Yes)알았어! or (No)싫어!     //응답을 하겠지요?

 

셋째가 응답(Yes or No)한 후! 그 후의 결과!  즉, 라면이 있거나 없거나!!
둘째가 그 응답을 가지고 첫째(콜백 메서드)한테 가는거죠!


4. 권한 요청 응답처리

 

사용자가 응답하면!  시스템은 onRequestPermissionResult()메서드를 호출하여 사용자 응답을 전달해요!!

예를들었던 것을 예시로 !!


셋째가 응답을 하면! 둘째는 첫째한테가서 셋째의 응답(Yes or No)을 전달해요! 일르는 거죠!ㅋㅋ

(ㅋㅋㅋㅋㅋㅋㅋ동생 있거나 형,누나,오빠,언니가 있으신 분들은 쉽게 이해될지도....ㅋㅋㅋㅋ)


 

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResult)
{
	switch(requestCode)
    {
    	case MY_PERMISSIONS_REQUEST_CALL_PHONE:
        {
        	if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
            	Toast.makeText(this, "셋째가 라면 끓였어", Toast.LENGTH_LONG).show();
            }
            else
            {
            	Toast.makeText(this, "아직 셋째가 라면을 안끓였어...", Toast.LENGTH_LONG).show();
			}
            return;
        }
    }
}

 

public class MainActivity extends AppCompatActivity
{
 
    private final int MY_PERMISSIONS_REQUEST_CALL_PHONE=1000;  //여기!! *point4!!
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
 
        int permssionCheck = ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE);
 
        if (permssionCheck!= PackageManager.PERMISSION_GRANTED)
        {
             Toast.makeText(this,"권한 승인이 필요합니다",Toast.LENGTH_LONG).show();
 
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE))
            {
                Toast.makeText(this,"전화 권한이 필요합니다.",Toast.LENGTH_LONG).show();
            }
            else
            {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
                Toast.makeText(this,"전화 권한이 필요합니다.",Toast.LENGTH_LONG).show(); 
            }
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
    {
        switch (requestCode)
        {
            case MY_PERMISSIONS_REQUEST_CAMERA:
            {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                     Toast.makeText(this,"승인이 허가되어 있습니다.",Toast.LENGTH_LONG).show();
                     //CALL!!
                }
                else
                {
                    Toast.makeText(this,"아직 승인받지 않았습니다.",Toast.LENGTH_LONG).show();
                    //승인페이지로 넘기셔두 되공 그냥 메시지만 띄우셔도 되고용!
                }
                return;
            }
 
        }
    }
}

 

 

 

다음 포스팅은 같은 권한 처리지만 !! 꿀팁같은 꿀팁!!

이거는 진짜로다가 돈 받아야 될 정도의 꿀팁인데!! 한번 포스팅 해볼게요!!ㅋㅋㅋ 

 

초보자분들 화이팅!! 같이 힘내보아용~!

 

텍스트뷰나 버튼에 전화걸기를 적용하고 싶으신데 궁금한 점이 있으시다면

 

카카오톡 wkd13927 검색 후에 물어봐주세요!!

 

댓글