안녕하세요 초보개발자 시아아빠입니다~!
오늘 포스팅은!! 저번 포스팅에서 말씀드렸던 것처럼 꿀팁에 대해서 포스팅할텐데요~!
어떤 꿀팁이냐~~ 권한 설정에 대한 꿀팁이에요!!
왜 꿀팁인지는 포스팅하면서 설명해드리겠습니다.
우선 저는 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
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)일 경우 제 프로젝트에서는 로그인페이지로 가도록 하였습니다.!!
이상 꿀팁이라면 꿀팁이고 경력이 쌓이면서 생기는 경험이라면 경험인데요!!
초보개발자 분들에게는 이런식으로도 응용이라던지 내 기술을 만드는 법이 있다는 것을 아시고
눈을 넓혀갈 수 있는 글이 되었으면 합니다~! ^^
'Android > Develop' 카테고리의 다른 글
[Android] 진동(Vibrator) 사용법 (0) | 2019.07.24 |
---|---|
[Android] 안드로이드 스튜디오 "뒤로가기"버튼 두번 눌러 앱 종료시키기! (0) | 2019.07.17 |
[Android] TextView에 적힌 번호로 전화걸기(권한 요청까지) (2) | 2019.07.05 |
[Android] dismiss()!!AlertDialog는 되고 AlertDialog.Builder은 안되고?! (0) | 2019.07.03 |
[Android]안드로이드 상태표시줄 색상 설정하기! (0) | 2019.06.25 |
댓글