caTea 블로그

android permission activity 본문

android

android permission activity

ZaRas 2017. 2. 22. 11:17
반응형

Utils 클래스는 널체크 용이므로 본인이 수정하여 사용하면 됨

Constans 클래스는 상수 정의 클래스 본인이 만들어서 사용



매니패스트는 아래와 같이 한쌍으로 사용해야 Manifast.permission 에 보이게된다.

자세한 내용은 구글 가이드 문서 참조

<uses-permission android:name="android.permission.CAMERA" />
<permission
android:name="android.permission.CAMERA"
android:protectionLevel="signature" />


====================================================



/**
* 마시멜로우 버전부터 퍼미션이 추가되었다 하여 퍼미션을 적용하는 로직을 베이스 액티비티에서
* 담당하도록 하였다.
*/
public class BaseActivity extends AppCompatActivity {

private final String TAG = this.getClass().getSimpleName();
private int permissionTag = 0;
private PermissionVO mPermissionVO;
private boolean shouldShow = false;
private ArrayList<PermissionVO> mPermissionList;
private boolean mIsFirstRun;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 앱을 처음 실행시킨 여부확인
mIsFirstRun = Utils.getSharedPreference(this, "isFirstRun", true);
Log.d(TAG, "mIsFirstRun :: "+mIsFirstRun);
}

/**
* 단일 안드로이드 권한 요청
* @param permission Manifast.permission.요청퍼미션
* @param tag 요청 태그
*/
@TargetApi(Build.VERSION_CODES.M)
protected void checkPermission(String permission, int tag){
permissionTag = tag;

if(Utils.isNull(permission) == false){
if(ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED){
//Manifest.permission.READ_CALENDAR이 접근 승낙 상태 일때
permissionGranted(tag);
}else{
//Manifest.permission.READ_CALENDAR이 접근 거절 상태 일때
if(ActivityCompat.shouldShowRequestPermissionRationale(this,permission)){
//최초 접속이 아니고, 사용자가 다시 보지 않기에 체크를 하지 않고, 거절만 누른경우
shouldShow = true;
}else{
//최초 접속시, 사용자가 다시 보지 않기에 체크를 했을 경우
shouldShow = false;
}

//만약 사용자가 다시 보지 않기에 체크를 했을 경우엔 권한 설정 다이얼로그가 뜨지 않는다.
//사용자에게 접근권한 설정을 요구하는 다이얼로그를 띄운다.
ActivityCompat.requestPermissions(this,new String[]{permission},tag);
}
}
}

/**
* 멀티 안드로이드 권한 요청
* @param permissionList
* @param tag 요청 태그
* */
protected void checkPermission(ArrayList<PermissionVO> permissionList, int tag){
if(permissionList != null){
permissionTag = tag;
mPermissionList = permissionList;
String[] permissions = new String[permissionList.size()];

for (int i=0; i < permissionList.size(); i++) {
permissions[i] = permissionList.get(i).getmPermissionName();
}

for(int i=0; i < permissions.length; i++){
if(ContextCompat.checkSelfPermission(this, permissions[i]) == PackageManager.PERMISSION_GRANTED){
//Manifest.permission.READ_CALENDAR이 접근 승낙 상태 일때
mPermissionList.get(i).setmGranted(true);
}else{
//Manifest.permission.READ_CALENDAR이 접근 거절 상태 일때
if(ActivityCompat.shouldShowRequestPermissionRationale(this,permissions[i])){
//최초 접속이 아니고, 사용자가 다시 보지 않기에 체크를 하지 않고, 거절만 누른경우
mPermissionList.get(i).setmShouldShow(true);
}else{
//최초 접속시, 사용자가 다시 보지 않기에 체크를 했을 경우
mPermissionList.get(i).setmShouldShow(false);
}

//만약 사용자가 다시 보지 않기에 체크를 했을 경우엔 권한 설정 다이얼로그가 뜨지 않는다.
//사용자에게 접근권한 설정을 요구하는 다이얼로그를 띄운다.
ActivityCompat.requestPermissions(this, permissions, tag);
}
}
}
}

// protected void checkPermissions(ArrayList<PermissionVO> permissionList){
//
// checkPermission(permissions, MUNTI_REQUEST_PERMISSION);
// }

@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {

// 어플리케이션의 처음시작시 거절하게되면 shouldShow 가 다시보지않기의 값으로 날라오기떄문에 첫시작시
// shouldShow 를 true 로 강제로 박아준다
if(mIsFirstRun) {
shouldShow = true;
Utils.setSharedPreference(this, "isFirstRun", false);
mIsFirstRun = false;
}

switch (requestCode) {
case Constants.PERMISSION_LOCATION: {
// If request is cancelled, the result arrays are empty.
Log.d(TAG, "reqest Permission :: " + permissions.length);
Log.d(TAG, "reqest grantResults :: " + grantResults.length);

if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

permissionGranted(permissionTag);

// permission was granted, yay! Do the
// contacts-related task you need to do.

} else {
permissionDenied(shouldShow, permissionTag);

// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
case Constants.PERMISSION_MULTI: {
if (grantResults.length > 0) {

for(int i=0; i < grantResults.length; i++){
Log.d(TAG, "permission ::" + permissions[i]);
Log.d(TAG, "granted ::" + grantResults[i]);

if(grantResults[i] == PackageManager.PERMISSION_GRANTED){
mPermissionList.get(i).setmGranted(true);
}else{
mPermissionList.get(i).setmGranted(false);
}
}

permissionResultMulti(mPermissionList);
}

return;
}
}
}

/**
* 단일 퍼미션 요청 성공
* @param permissionIndex 요청 태그
*/
protected void permissionGranted(int permissionIndex){

}

/**
* 단일 퍼미션 요청 실패
* @param shouldShow 퍼미션 요청 다이얼로그 보여준여부와 다시보지않기 여부
* @param permissionIndex 요청 태그
*/
protected void permissionDenied(boolean shouldShow, int permissionIndex){

}

/**
* 멀티 퍼미션 요청 결과
* @param resultList 요청결과
*/
protected void permissionResultMulti(ArrayList<PermissionVO> resultList){

}



}

====================================================================================================


/**
* Created by achee7059 on 2017. 2. 20..
*/

public class PermissionVO {
/**
* 요청 퍼미션 이름
*/
private String mPermissionName;
/**
* 이 요청을 보여준 여부와 다시보지않기 버튼여부
*/
private boolean mShouldShow;

/**
* 퍼미션 허용여부
*/
private boolean mGranted;
/**
* 요청 태그
*/
private int mTag;

public PermissionVO(String permissionName, int tag){
mPermissionName = permissionName;
mTag = tag;
}

public boolean ismShouldShow() {
return mShouldShow;
}

public void setmShouldShow(boolean mShouldShow) {
this.mShouldShow = mShouldShow;
}

public String getmPermissionName() {
return mPermissionName;
}

public void setmPermissionName(String mPermissionName) {
this.mPermissionName = mPermissionName;
}

public int getmTag() {
return mTag;
}

public void setmTag(int mTag) {
this.mTag = mTag;
}

public boolean ismGranted() {
return mGranted;
}

public void setmGranted(boolean mGranted) {
this.mGranted = mGranted;
}
}

==================================================================================

사용 예


public class IntroActivity extends BaseActivity{

private final String TAG = getClass().getSimpleName();



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intro);


//        멀티 요청
// checkPermission();
// ArrayList<PermissionVO> permissionList = new ArrayList<PermissionVO>();
// permissionList.add(new PermissionVO(Manifest.permission.ACCESS_COARSE_LOCATION, 0));
// permissionList.add(new PermissionVO(Manifest.permission.CAMERA, 1));       
checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, Constants.PERMISSION_LOCATION);

}



@Override
public void permissionGranted(int permissionIndex) {
Log.d("BaseActivity", "permissionIndex :: " + permissionIndex);

}

@Override
public void permissionDenied(boolean shouldShow, int permissionIndex) {
Log.d(TAG, "ShouldShow::"+shouldShow);
if(shouldShow){
//구글의 요청 다이얼로그에서 거절을 누른경우
System.exit(1);
}else{
//전에 구글의 요청 다이얼로그에서 다시 보지 않기를 체크후 앱을 킨 경우.
//requestPermission을 쓰더라도 요청 다이얼로그가 뜨질 않고 곧바도 여길 탄다.
}
}

@Override
protected void permissionResultMulti(ArrayList<PermissionVO> resultList) {
for(PermissionVO vo : resultList){
Log.d(TAG, "permission :: " + vo.getmPermissionName());
Log.d(TAG, "permission :: " + vo.ismGranted());
}
}

}


728x90

'android' 카테고리의 다른 글

Magnify Anim View Pager  (0) 2017.03.13
android frame animation class  (0) 2017.02.22
vertical view pager  (0) 2016.07.01
이미지 라운드 처리 클래스  (0) 2016.06.28
android file upload and spring(image..)  (1) 2015.08.05