마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

지도위험권한 에러가 났습니다 도와주세요

0 추천

아래와 같은 위험권한 코드를 사용하고있습니다. 처음 실행시에는 권한요청을 하면서 잘되다가 두번째 실행했을때는 권한요청승인 메시지와 java.lang.IllegalArgumentException: permission cannot be null or empty 이러한 에러 메시지와 함께 프로그램이 죽어버립니다... 검색을해봐도 도무지 원일을 알수가 없네요 도와주세요 ㅠ

    String[] permissions = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };
    checkPermissions(permissions);
}
public void checkPermissions(String[] permissions) {
    ArrayList<String> targetList = new ArrayList<String>();

    for (int i = 0; i < permissions.length; i++) {
        String curPermission = permissions[i];
        int permissionCheck = ContextCompat.checkSelfPermission(this, curPermission);
        if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, curPermission + " 권한 있음.", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, curPermission + " 권한 없음.", Toast.LENGTH_LONG).show();
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, curPermission)) {
                Toast.makeText(this, curPermission + " 권한 설명 필요함.", Toast.LENGTH_LONG).show();
            } else {
                targetList.add(curPermission);
            }
        }
    }

    String[] targets = new String[targetList.size()];
    targetList.toArray(targets);

    ActivityCompat.requestPermissions(this, targets, 101);

}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 101: {
            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;
        }
    }
}
이이창민 (560 포인트) 님이 2021년 11월 28일 질문

1개의 답변

0 추천
 
채택된 답변

아무래도 checkPersmission안에서 targetList가 비어있거나 해서 targets가 빈 배열이 된 것 같이 보이네요. 권한 체크하는 부분에서 유저가 deny를 한게 아니면 권한 요청을 다시 해야 할 것 같은데, 현재 로직은 첫번째 거부를 한 경우는 토스트 메세지만 보이고 권한요청을 하지 않게 되어 있네요.

아래처럼  요청할 권한을 생성할 때 권한이 비어있는지 아닌지 체크해 보심이 어떻런지.

    String[] permissions = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    };
    String[] permissionsToRequest = getPermissionsToRequest(permissions);
    if (permissionsToRequest.length == 0) {
         // 계속 진행
         return;
    }

    requestPermissions(permissionsToRequest)
}

public void requestPermissions(String[] permissions) {
    ActivityCompat.requestPermissions(this, permissions, 101);
}

public String[] getPermissionsToRequest(String[] manifestPermissions) {
      ...

    if (targetList.size == 0)  {
          return new String[]; 
   }

    String[] targets = new String[targetList.size()];
    targetList.toArray(targets);

    return targets;
}

 

spark (224,800 포인트) 님이 2021년 11월 28일 답변
spark님이 2021년 11월 29일 수정
와 정말 고민을 한번에 해결해주는 답변입니다 ㅠ spark님 항상 친절하게 답변해주시고 정말 감사드려요
...