본문 바로가기
Android/Develop

[Android] 권한 설정 응용

by hyun's life_developer 2019. 7. 11.

 

 

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

오늘 포스팅은!! 저번 포스팅에서 말씀드렸던 것처럼 꿀팁에 대해서 포스팅할텐데요~!

 

어떤 꿀팁이냐~~   권한 설정에 대한 꿀팁이에요!!

 

왜 꿀팁인지는 포스팅하면서 설명해드리겠습니다.

 

우선 저는 IntroActivity를 따로 만들었습니다. IntroActivity는 무엇을 말하느냐!?

바로 앱을 눌렀을때 실행되는 첫 로딩(?)화면 이라고 생각하시면 됩니다.

(IntroActivity 이름은 짓기 나름이에요! 저는 그냥 이렇게 지었다고 말씀드립니다 ㅎ)

 

쉽게 말해서 앱 실행시!! Main이든 Login화면이든 IntroActivity를 거쳐서 갈텐데요!!

 

결과적으로 앱 실행시 제일 처음 실행되는 액티비티가 바로 IntroActivity가 되겠죠!

 

저는 여기서 바로 권한을 주어서 다른 액티비티마다 권한을 줄 필요 없도록 하는거에요!

 

진짜 꿀팁이죠?!ㅋㅋㅋㅋㅋㅋ

 

중급,고급 개발자 분들은 당연히 많이 커스텀해서 쓰실텐데요?!

 

저와 같은 갓 개발자는 이렇게 구현하기 어렵죠~! 그렇다면 따라해보세요!

 

먼저, Manifest.xml에 사용하실(필요로 하시는) 권한을 넣습니다.  *_*

 

...더보기

ex)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.DIAL_PHONE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

  

 

 

 IntroActivity.java

package com.test;

import android.content.Intent;
import android.content.pm.PackageManager;

public class IntroActivity extends BasicActivity {

	public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
        setContentView(R.layout.intro_layout);  //보여줄 layout.xml
        
        if(!hasPermissions())  ----- //권한이 없을경우
        {
        	requestPermissions();    //권한 요청
        }
        else           ------------- //있을 경우
        {
        	init(true);  //저의 경우 init()메소드를 만들어 로그인 페이지에 연결
        }
    }
	//~~~~~~~~~~~~~~~
	public static final int REQ_PERMISSION_ALL = 1000;

	//@formatter:off
	private String[] permissions = {
			Manifest.permission.READ_PHONE_STATE,
			Manifest.permission.CALL_PHONE,
			Manifest.permission.READ_EXTERNAL_STORAGE,
			Manifest.permission.WRITE_EXTERNAL_STORAGE,
			Manifest.permission.ACCESS_FINE_LOCATION,
			Manifest.permission.ACCESS_COARSE_LOCATION
	};
	//@formatter:on

	private boolean hasPermissions() {
		//if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
		//    return true;

		for (String permission : permissions) {
			if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
				return false;          //권한을 체크해주고 권한이 없다면 false를 반환
			}
		}

		return true;     //권한이 있다면 true를 반환
	}

	private void requestPermissions() {
		ActivityCompat.requestPermissions(this, permissions, REQ_PERMISSION_ALL);
	}

	@Override
	public void onRequestPermissionsResult(int permissionCode, String permissions[], int[] grantResults) {
		try {
			switch (permissionCode) {
				case REQ_PERMISSION_ALL: {
					boolean allPermissionEnabled = true;
					for (int grandResult : grantResults) {
						if (grandResult != PackageManager.PERMISSION_GRANTED) {
							allPermissionEnabled = false;
						}
					}

					if (allPermissionEnabled)
						init(false);
					}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
	}

}

이렇게 하시면 됩니다~!!

 

 


이해를 필요로 하시는 분들을 위해 설명을 좀 드리겠습니다. 

이하 설명이 필요로 하시는 분들만 구독하시면 되겠습니다.


 

 

 

 

...더보기

public static final int REQ_PERMISSION_ALL = 1000;
//@formatter:off
private String[] permissions = {
          Manifest.permission.READ_PHONE_STATE,
          Manifest.permission.CALL_PHONE,
          Manifest.permission.READ_EXTERNAL_STORAGE,
          Manifest.permission.WRITE_EXTERNAL_STORAGE,
          Manifest.permission.ACCESS_FINE_LOCATION,
          Manifest.permission.ACCESS_COARSE_LOCATION
};
//@formatter:on

private boolean hasPermissions() {
               //if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
               // return true;

              for (String permission : permissions)

              {
                    if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                        return false;
                     }
              }

              return true;
}

private void requestPermissions() {
                 ActivityCompat.requestPermissions(this, permissions, REQ_PERMISSION_ALL);
}

@Override
public void onRequestPermissionsResult(int permissionCode, String permissions[], int[] grantResults) {
              try {
                   switch (permissionCode) {
                             case REQ_PERMISSION_ALL: {
                                     boolean allPermissionEnabled = true;
                                     for (int grandResult : grantResults) {
                                              if (grandResult != PackageManager.PERMISSION_GRANTED) {
                                                allPermissionEnabled = false;
                                               }
                                     } 

                             if (allPermissionEnabled)
                                   init(false);
                                }
                   }
              } catch (Exception e) {
                        e.printStackTrace();
                }     
}

권한요청 및 응답 처리에 대하여 잘 이해가 안가신다 하시는 분은 아래 링크를 참고하세요.

https://siadaddy-cordinglife.tistory.com/6 

 

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

안녕하세요! 초보개발자 시아아빠입니다. 이번 포스팅의 주제는 TextView에 적힌 번호로 전화를 걸어볼거에요! 먼저 목적 순서에따라 설명을 하고 정리를 한 번 해볼까해요~! 우선... 전화를 걸어야 해요!! 그럼..

siadaddy-cordinglife.tistory.com

 

1.   ----권한 값 변수 설정  

...더보기

public static final int REQ_PERMISSION_ALL = 1000;

 

2.   ----권한들을 permissions이라는 변수에 담음!! (String 배열)

      (사용하시는, 필요로 하시는 권한들을 넣으시면 됩니다. 밑에는 예일 뿐이에요) ▼

...더보기

private String[] permissions = {
          Manifest.permission.READ_PHONE_STATE,
          Manifest.permission.CALL_PHONE,
          Manifest.permission.READ_EXTERNAL_STORAGE,
          Manifest.permission.WRITE_EXTERNAL_STORAGE,
          Manifest.permission.ACCESS_FINE_LOCATION,
          Manifest.permission.ACCESS_COARSE_LOCATION
};

 

 

3. 권한을 확인 니다!!

  permissions변수를  String permission에 넣는 작업을 for문으로 반복해요.                               

                             

 

...더보기

private boolean hasPermissions() {
               
              for (String permission : permissions)

              {
                    if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                        return false;
                     }
              }

              return true;
}

 

4.  권한을 요청합니다~!

...더보기

private void requestPermissions() {
                 ActivityCompat.requestPermissions(this, permissions, REQ_PERMISSION_ALL);
}

 

5. 권한 요청 응답처리!! (onRequestPermissionsResult는 콜백 메소드로 보시면 됩니다.)

...더보기

@Override
public void onRequestPermissionsResult(int permissionCode, String permissions[], int[] grantResults) {
              try {
                   switch (permissionCode) {
                             case REQ_PERMISSION_ALL: {
                                     boolean allPermissionEnabled = true;
                                     for (int grandResult : grantResults) {
                                              if (grandResult != PackageManager.PERMISSION_GRANTED) {
                                                allPermissionEnabled = false;
                                               }
                                     } 

                             if (allPermissionEnabled)
                                   //저같은 경우 login페이지로 이동하는 액티비티를

                                   //init()에 넣었고 여기서 init(); 을 실행
                                }
                   }
              } catch (Exception e) {
                        e.printStackTrace();
                }     
}

 

permissionCode가 REQ_PERMISSION_ALL 일 시! allPermissionEnabled = true; 를 반환해요

 

grandResult가 PackageManager.PERMISSION_GRANTED와 같지 않을시

 

allPermissionEnabled = false;를 반환

 

allPermissionEnabled(=true)일 경우 제 프로젝트에서는  로그인페이지로 가도록 하였습니다.!!


 

이상 꿀팁이라면 꿀팁이고 경력이 쌓이면서 생기는 경험이라면 경험인데요!!

 

초보개발자 분들에게는 이런식으로도 응용이라던지 내 기술을 만드는 법이 있다는 것을 아시고

 

눈을 넓혀갈 수 있는 글이 되었으면 합니다~! ^^ 

 

 

댓글