Notice
Recent Posts
Recent Comments
Link
투케이2K
411. (android/java) [android 12 / target 31] 블루투스 및 위치 권한 퍼미션 설정 및 권한 요청 방법 - 타겟 31 대응 본문
Android
411. (android/java) [android 12 / target 31] 블루투스 및 위치 권한 퍼미션 설정 및 권한 요청 방법 - 타겟 31 대응
투케이2K 2022. 11. 24. 14:05[개발 환경 설정]
개발 툴 : AndroidStudio
[AndroidManifest.xml : 소스 코드]
<!-- 블루투스 및 GPS : 퍼미션 설정 선언 -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--블루투스 권한 추가 sdk 31 대응-->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
[C_Permission : 소스 코드]
import android.Manifest;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import com.gun0912.tedpermission.PermissionListener;
import com.gun0912.tedpermission.TedPermission;
import java.util.List;
public class C_Permission {
/**
* TODO [클래스 설명]
* // -----------------------------------------
* 1. 퍼미션 관리 클래스
* // -----------------------------------------
* 2. 테드 퍼미션 (tedpermission) 사용 : implementation 'gun0912.ted:tedpermission:2.2.2'
* // -----------------------------------------
* 3. 호출 방법 : [퍼미션 권한 부여 확인 실시]
* C_Permission.checkPermission(A_Main.this);
* // -----------------------------------------
* */
// TODO [전역 변수 선언 실시]
public static final String AL_TITLE = "퍼미션 권한 알림";
public static final String AL_NPA = "권한 허가를 동의 하지않으셨습니다."+"\n"
+"일부 기능 사용에 제한이 있을 수 있습니다"+"\n"
+"[설정] > [권한]에서 거부한 권한을 활성해주세요";
public static final String AL_NQA = "안전한 앱 사용을 위해 보안 상태 확인 권한 동의를 해주세요.";
public static final String AL_OK = "확인";
public static final String AL_SET = "설정";
public static final String AL_NO = "취소";
// TODO [퍼미션 체크 메소드]
public static Context context;
public static void checkPermission(Context mContext) {
context = mContext;
try {
Log.i("---","---");
Log.d("//===========//","================================================");
Log.i("","\n"+"[C_Permission >> checkPermission() :: 퍼미션 부여 확인 실행]");
Log.d("//===========//","================================================");
Log.i("---","---");
// TODO [안들외드 12 버전 / 타겟 31 대응 권한 요청 분기 처리]
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){ // [타겟 31 이상]
TedPermission.with(mContext)
.setPermissionListener(permissionlistener) // [퍼미션이 부여 체크 이벤트 리스너 지정]
// TODO [AndroidManifest.xml 에 등록된 퍼미션 등록]
.setPermissions(
// -----------------------------------------
// [블루투스 권한]
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
// -----------------------------------------
// [위치 권한]
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
// -----------------------------------------
// TODO [타겟 31 대응 >> 블루투스 권한 추가]
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT
// -----------------------------------------
)
.check();
}
else { // [타겟 31 미만]
TedPermission.with(mContext)
.setPermissionListener(permissionlistener) // [퍼미션이 부여 체크 이벤트 리스너 지정]
// TODO [AndroidManifest.xml 에 등록된 퍼미션 등록]
.setPermissions(
// -----------------------------------------
// [블루투스 권한]
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
// -----------------------------------------
// [위치 권한]
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
// -----------------------------------------
)
.check();
}
}
catch (Exception e){
e.printStackTrace();
}
}
// TODO [퍼미션이 부여 되었는지 확인 메소드]
static PermissionListener permissionlistener = new PermissionListener() {
@Override
public void onPermissionGranted() {
Log.i("---","---");
Log.w("//===========//","================================================");
Log.i("","\n"+"[C_Permission >> checkPermission() :: 전체 퍼미션 부여 확인 성공]");
Log.w("//===========//","================================================");
Log.i("---","---");
}
@Override
public void onPermissionDenied(List<String> deniedPermissions) {
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[C_Permission >> checkPermission() :: 전체 퍼미션 부여 확인 실패]");
Log.i("","\n"+"[거부된 권한 :: "+String.valueOf(deniedPermissions.toString())+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
// -----------------------------------------
// [연속적으로 퍼미션을 허용 받기위해 재귀함수 루틴 사용]
// checkPermission();
// -----------------------------------------
// [Alert 팝업창 알림 실시]
getAlertDialog(
context,
0, // [설정창 이동 타입 지정]
AL_TITLE,
AL_NPA,
AL_SET,
AL_NO,
"");
// -----------------------------------------
}
};
//TODO [권한 거부 시 팝업창 호출 부분]
public static void getAlertDialog(Context mContext, int type, String header, String content, String ok, String no, String normal){
try {
// [타이틀 및 내용 표시]
final String Tittle = header;
final String Message = content;
// [버튼 이름 정의]
String buttonNo = no;
String buttonYes = ok;
String buttonNature = normal;
// [AlertDialog 팝업창 생성]
new AlertDialog.Builder(mContext)
.setTitle(Tittle) // [팝업창 타이틀 지정]
//.setIcon(R.drawable.app_icon) // [팝업창 아이콘 지정]
.setMessage(Message) // [팝업창 내용 지정]
.setCancelable(false) // [외부 레이아웃 클릭시도 팝업창이 사라지지않게 설정]
.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// -----------------------------------------
// TODO [애플리케이션 설정창 이동 실시]
if (type == 0){
// [애플리케이션 설정 창으로 이동한다]
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
intent.setData(uri);
mContext.startActivity(intent);
}
// -----------------------------------------
// TODO [QueryAllPackagesPermission 앱 설정 창 이동]
else if (type == 1){
// [Android Q 이상 버전에서 원격 제어앱 탐지를 위해 사용자 정보 접근 권한 필요]
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
intent.setData(uri);
mContext.startActivity(intent);
}
// -----------------------------------------
}
})
.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.setNeutralButton(buttonNature, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
})
.show();
}
catch (Exception e){
//e.printStackTrace();
Log.i("---","---");
Log.e("//===========//","================================================");
Log.i("","\n"+"[C_Permission >> getAlertDialog() :: 팝업창 호출 실시]");
Log.i("","\n"+"[catch [에러] :: "+String.valueOf(e.getMessage())+"]");
Log.e("//===========//","================================================");
Log.i("---","---");
try {
// [토스트 알림 표시]
Toast.makeText(mContext, String.valueOf(content), Toast.LENGTH_LONG).show();
}
catch (Exception ex){
ex.printStackTrace();
}
}
}
} // TODO [클래스 종료]
반응형
'Android' 카테고리의 다른 글
Comments