Permission
Android에서 각 application은 고유한 시스템 아이디(Linux의 user id 및 group id)를 사용하여 실행
각 애플리케이션은 각각 프로세스 샌드박스에서 실행 되며 자신의 영역이 아닌 다른 추가적인 부분의 기능 필요시 권한 신청 필요 !
권한 신청 방법
1. AndroidManifest.xml 파일에 필요한 권한을 추가
2. Dangerous 권한인 경우 런타임에 반드시 권한 확인
1) Normal Permission : 다른 애플리케이션의 실행을 방해하거나 사생활 침해의 우려가 없는 권한
2) Dangerous Permission : 다른 애플리케이션의 실행을 방해하거나 사생활을 침해할 수 있는 권한
Normal Permission의 예
- 인터넷 사용, 와이파이 상태 확인 등
Dangerous Permission의 예
- 캘린더 읽기/쓰기, 연락처 읽기/쓰기, 카메라 사용, 사용자 위치 확인, 오디오 녹화, 전화 걸기, 통화이력확인
- 외부 저장소에 파일 읽기/쓰기
외부 저장소는 SD 카드 등을 의미하는 것이 아니라 내 앱의 샌드박스 영역 밖을 의미
즉 외장 메모리가 없는 폰이라도 내 앱의 영역 밖의 폴더는 외부 저장소가 됨
Intent의 action을 통해 기능을 사용하는 경우에는 내 앱이 해당 권한을 얻지 않아도 됨
- gallery에서 그림을 받는 경우
- voice 인식 앱에서 결과 String을 받는 경우
Normal Permission
1. New Project 생성
2. App의 Build.gradle에서 viewBinding 설정
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
viewBinding { enabled = true }
defaultConfig {
applicationId "com.example.permissions"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
또는
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
buildFeatures { viewBinding = true }
defaultConfig {
applicationId "com.example.permissions"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
-> sync now
3. activity_main.xml에 WebView 추가
<WebView
android:id="@+id/webView"
android:layout_width="0dp"
android:layout_height="400dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
4. ActivityMain.java에 https://www.naver.com 을 로딩하는 코드 작성후 실행
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.webView.setWebViewClient(new WebViewClient());
binding.webView.loadUrl("https://www.naver.com");
}
}
5. 인터넷 권한 설정
AndroidManifest.xml 에 코드 추가
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.codesample.permissions">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup=“true" // 이하 생략
6. 최신 폰에서 안될 경우
-> Android API Pie API 29 부터 http 접속을 허용하지 않기 때문에 AndroidManifest.xml에 코드 추가
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
Dangerous Permission
1. AndroidManifest.xml에 권한 추가
<uses-permission android:name=“android.permission.SEND_SMS”/>
2. activity_main.xml 의 WebView 하단에 2개의 EditText와 버튼 추가
<EditText
android:id="@+id/editTextMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:inputType="textPersonName"
android:ems="10"
android:hint="문자 내용"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/webView" />
<EditText
android:id="@+id/editTextReceiver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:inputType=“phone"
android:ems="10"
android:hint="번호"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextMessage" />
<Button
android:id="@+id/buttonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text=“Send"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextReceiver" />
Permission을 요청하는 순서 : 파란 색 부분을 함수로 분리하면 편리
3. 요청 변수 선언 및 퍼미션 체크 -> 없을 경우 요청 함수 추가
private ActivityMainBinding binding;
private final int REQ_SMS=10;
private boolean checkAndRequestPermission(){
if(ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS)
== PackageManager.PERMISSION_GRANTED)
return true;
requestPermissions(new String[]{Manifest.permission.SEND_SMS}, REQ_SMS);
return false;
}
SMS를 보내는 기능을 수행하는 함수 추가 및 결과 처리 함수 Override
private void sendSMS(){
String message = binding.editTextMessage.getText().toString();
String receiver = binding.editTextReceiver.getText().toString();
if(!message.isEmpty() && !receiver.isEmpty()) {
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(receiver, null, message, null, null);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==REQ_SMS){
if(grantResults[0]==PackageManager.PERMISSION_GRANTED)
sendSMS();
else{
Toast.makeText(this, "권한이 없어 전송하지 못했습니다.", Toast.LENGTH_SHORT).show();
}
}
}
binding.buttonSend.setOnClickListener(v->{
if(checkAndRequestPermission())
sendSMS();
});
4. 설정 -> 애플리케이션 메뉴에 가서 권한 관련 메뉴에서 sms 항목을 On/Off 하면서 테스트
'모바일 > 안드로이드' 카테고리의 다른 글
[Android] Step1 - 안드로이드 소개 (0) | 2021.06.22 |
---|---|
[Android] BroadcastReceiver (0) | 2021.06.18 |
[Android Studio] RecyclerView (0) | 2021.04.04 |
[Android Studio] SharedPreference (0) | 2021.04.04 |
[Android Studio]Activity 와 Intent (0) | 2021.04.04 |