본문 바로가기

모바일/안드로이드

[Android] Permission

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