2-2 펴미션 구현.
상속을 통한 퍼미션 구현.
BaseActivity 소스 추가.
//////////////////////////////////////////////////////////////////////////////////////////
abstract class BaseActivity extends AppCompatActivity {
abstract int setLayout();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(setLayout());
}
/**
* 아래 소스 추가 부분.
*/
/**
* 앱 퍼미션 권한 사용하기 위하여 상속을 이용
* 퍼미션 체크가 끝나면 동작할 인터페이스 리스너 생성
* 퍼미션 체크 메서드 구현.
* onRequestPermissionsResult 를 동작하고 난뒤 액티비티로 돌아와 나머지 동작 구현 확인.
* 리스너 등록하여 퍼미션 체크한 액티비티로 돌아가기.
*/
/**
* 인터페이스 등록.
*/
public interface PermissionCheckListener {
void permissionCheckFinish();
}
/**
* 상속받은 클래스에서 사용할 인터페이스 변수.
*/
public PermissionCheckListener permissionCheckListener;
/**
* 온 크레딧 바로 아래 생성 되어야 한다
*/
public void setPermissionCheckListener(PermissionCheckListener permissionCheckListener) {
this.permissionCheckListener = permissionCheckListener;
}
private final int PERMISSION_REQUEST = 1000;
/**
* 스트링 배열로 퍼미션 체크.
*/
public boolean permissionCheck(String[] strings) {
// 변수 사용시 리턴 타입 지정
// boolean check = false;
// 변수 사용안하면 바로 리턴 시킴.
/**안드로이드 마시멜로 이후 퍼미션 체크.*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (int i = 0; i < strings.length; i++) {
if (ContextCompat.checkSelfPermission(this, strings[i]) == PackageManager.PERMISSION_DENIED) {
ActivityCompat.requestPermissions(this, strings, PERMISSION_REQUEST);
// check = true;
// break;
return true;
}
}
}
//return check;
return false;
}
/**
* 거부를 했을때 처리
* 다시보지 않기 체크 후 거부를 하면 설정에서 권한을 허용하도록 요청.
* 허용하지 않을 경우 앱 사용 을 못함..
* 처리를 잘못하면 무한 반복할 경우가 생김.
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST) {
//안드로이드 마시멜로 이후 퍼미션 체크.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == 0) {
if (grantResults.length == (i + 1)) {
permissionCheckListener.permissionCheckFinish();
}
} else {
// 거부한 이력이 있으면 true를 반환한다.
if (shouldShowRequestPermissionRationale(permissions[i])) {
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST);
break;
} else {
new AlertDialog.Builder(this)
.setTitle("다시보지않기 클릭.")
.setMessage(permissions[i] + " 권한이 거부되었습니다 설정에서 직접 권한을 허용 해주세요.")
.setNeutralButton("설정", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
Toast.makeText(getApplicationContext(), "권한 설정 후 다시 실행 해주세요.", Toast.LENGTH_SHORT).show();
finish();
}
})
.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(), "권한 설정을 하셔야 앱을 사용할 수 있습니다.", Toast.LENGTH_SHORT).show();
finish();
}
})
.setCancelable(false)
.create().show();
}// shouldShowRequestPermissionRationale /else
} // 권한 거절
} // for end
}//Build.VERSION.SDK_INT end
}//requestCode end
}
}
//////////////////////////////////////////////////////////////////////////////////////////
MainActivity에서 사용 방법.
Manifest에
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
퍼미션 등록 확인.
//////////////////////////////////////////////////////////////////////////////////////////
public class MainActivity extends BaseActivity {
@Override
int setLayout() {
// BaseActivit에서 만들어 놓은 추상 메서그 구현.
// setContentView(R.layout.activity_main);
// 추상메서드로 구현.
return R.layout.activity_main;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 리스너 등록
* 퍼미션 검사가 끝나고 또는 검사 체크 후 구현 될 부분
*/
setPermissionCheckListener(new PermissionCheckListener() {
@Override
public void permissionCheckFinish() {
Log.e("log", "start Activity");
}
});
/**
* Manifest 에서 uses-permission 에 등록한 퍼미션 을 배열로 전달
* 권한 승인을 해야할려면 true 권한 승인이 모두 완료 되어 있다면 false
* 권한 체크가 되어 있다면 지나간다.
*/
if (permissionCheck(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE})) {
return;
}
/**퍼미션 체크 리스너 등록*/
permissionCheckListener.permissionCheckFinish();
}
}
//////////////////////////////////////////////////////////////////////////////////////////
상속을 이용한 퍼미션 권한 체크 확인 완료.
'Android > source code' 카테고리의 다른 글
TabLayout 예제 (0) | 2018.11.08 |
---|---|
코디네이터레이아웃에 리사이클러뷰 스크롤시 터치 오류 (0) | 2018.10.17 |
Android RecyclerView 예제 (0) | 2018.10.15 |
동적 레이아웃 등록(xml) (0) | 2018.10.11 |
액티비티 (0) | 2018.09.18 |