Abstract.
안드로이드 알람 기능을 구현하는 프로젝트를 진행하면서 퍼미션 체크가 제대로 되지 않아 삽질을 한 경험이 있다. 이전에는 단순히 AndroidManifest.xml에서 <uses-permission> 태그를 사용하여 필요한 권한을 등록하는 것으로 앱이 설치될 때 권한 등록이 되도록 기능을 사용했었는데, 안드로이드 SDK 23 이상부터는 앱이 실행되었을 때 권한 등록이 별도로 필요하다. 이것 때문에 알람기능이 계속 작동하지 않은 경험이 있었기에 이번 포스팅에서는 권한설정 기능을 일괄로 묶어서 앱이 실행될 때 퍼미션 체크를 할 수 있도록 구현해본다.
퍼미션 체크 구현
퍼미션 체크를 구현하기 위해서 가장 먼저 사용하고자 하는 퍼미션을 AndroidManifest.xml에 등록한다. 가장 흔하게 사용하는 알람 기능 관련 퍼미션을 사용해본다.
1. AndroidManifest.xml
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- POST_NOTIFICATIONS
- USE_EXACT_ALARM
- SCHEDULE_EXACT_ALARM
- FOREGROUND_SERVICE
2. PermissionUtils.java
권한 설정 일괄 체크 구현을 위해 다음과 같이 PermissionUtils 클래스를 만든다. 앱에서 사용할 권한 허용을 요청하는 기능을 해당 클래스에 작성하여 앱이 실행되었을 때 권한 허용이 누락되어 기능이 정상적으로 작동하지 않는 문제를 방지할 수 있다.
public class PermissionUtils {
private Context context;
private Activity activity;
// Manifest에 권한을 작성 후
// 요청할 권한을 배열로 저장
private String[] permissions = {
android.Manifest.permission.POST_NOTIFICATIONS,
android.Manifest.permission.USE_EXACT_ALARM,
android.Manifest.permission.SCHEDULE_EXACT_ALARM,
Manifest.permission.FOREGROUND_SERVICE,
};
// 권한 요청을 할 때 발생하는 창에 대한 결과값
private List<Object> permissionList;
private final int MULTIPLE_PERMISSIONS = 1023 ;
public PermissionUtils(Activity _activity, Context _context){
this.activity = _activity;
this.context = _context;
}
// 허용할 권한 요청이 남았는지 체크
public boolean checkPermission(){
int result;
permissionList = new ArrayList<>();
// 배열로 저장한 권한 중 허용되지 않은 권한이 있는지 체크
for (String pm : permissions){
result = ContextCompat.checkSelfPermission(context, pm);
if(result != PackageManager.PERMISSION_GRANTED){
permissionList.add(pm);
}
}
return permissionList.isEmpty();
}
// 권한 허용 요청
public void requestPermission(){
ActivityCompat.requestPermissions(activity, permissionList.toArray(new String[permissionList.size()]),
MULTIPLE_PERMISSIONS);
}
// 권한 요청에 대한 결과 처리
public boolean permissionResult(int requestCode , @NonNull String[] permissions, @NonNull int[] grantResults){
if (requestCode == MULTIPLE_PERMISSIONS && (grantResults.length > 0)){
for(int i =0; i < grantResults.length ; i ++){
// grantResults == 0 사용자가 허용한 것
// grantResults == -1 사용자가 거부한 것
if(grantResults[i] == -1){
return false;
}
}
}
return true;
}
}
2. MainActivity.java
PermissionUtils에서 정의된 권한체크의 실행을 위해 MainActivity.java 파일에서 다음과 같이 코드를 작성한다. 앱이 실행되어 MainActivity.java의 화면이 실행되면 권한 설정을 위한 알람이 나타난다.
public class MainActivity extends AppCompatActivity {
private PermissionUtils permission;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permissionCheck();
}
// 권한 체크 : 퍼미션 넣을 경우 대시보드 카드뷰 클릭 안됨
private void permissionCheck(){
// sdk 23버전 이하 버전에서는 permission이 필요하지 않음
if(Build.VERSION.SDK_INT >= 23){
// 클래스 객체 생성
permission = new PermissionUtils(this, this);
// 권한 체크한 후에 리턴이 false일 경우 권한 요청을 해준다.
if(!permission.checkPermission()){
permission.requestPermission();
}
}
}
// Request Permission에 대한 결과 값을 받는다.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 리턴이 false일 경우 다시 권한 요청
if (!permission.permissionResult(requestCode, permissions, grantResults)){
permission.requestPermission();
}
}
}
퍼미션 체크 구현 결과
앱 실행 시 앱에서 사용할 모든 권한을 일괄 허용할 수 있는 기능을 구현해보았다.
화면 하단에 알람에 대한 권한 허용을 묻는 다이얼로그가 나타나 구현한 기능이 정상 작동하는 것을 확인할 수 있다. 이렇게 사전에 앱의 권한을 설정함으로써 기능이 정상적으로 작동하지 않는 문제를 해결할 수 있다. 권한 설정 기능을 담은 PermissionUtils.java를 작성하여 해당 클래스를 권한 설정을 묻는 다이얼로그를 표시할 액티비티에 연결하여 사용하면 된다.
'Android > Android Lab' 카테고리의 다른 글
안드로이드 카드뷰(CardView) 배경색 개별 설정 (0) | 2024.04.07 |
---|---|
안드로이드 스튜디오 깃허브 연동 (1) | 2023.10.15 |
안드로이드 커스텀 체크박스 구현 (0) | 2023.03.10 |
안드로이드 DataBinding (1) | 2023.03.10 |
[Java] 안드로이드 간단한 설문조사 기능 구현 (0) | 2023.01.28 |
댓글