티스토리 뷰

마시멜로부터 권한을 얻어오는 방식이 바뀌었다. 마시멜로가 나온지 1년이 넘었는데 아직도 책이 안나왔다.


#권한 얻는 방법 2가지


1. 안드로이드 OS가 Marshmellow 이전 버전일 때

  • 롤리팝, 젤리빈, 아이스크림샌드위치, 등등

  • AndroidManifest.xml <uses-permission /> 을 추가시켜준다.


2. 안드로이드 OS가 Masrhmellow 이후 버전일 때

  • AndroidManifest.xml <uses-permission /> 을 추가시켜준다.

  • 추가적으로 실시간 권한 허가 작업이 필요하다.



#실습

1. 프로젝트를 생성한다. ( 이름 : Call Admission App )

2. 버튼 하나를 만든다.

<Button

  android:layout_width="wrap_content"

  android:layout_height="wrap_content"

  android:text="전화 걸기"

  android:id="@+id/button"

  android:layout_below="@+id/textView"

  android:layout_alignParentLeft="true"

  android:layout_alignParentStart="true" />


3. 버튼 이벤트를 만든다.



빨간 줄이 생긴다.


4. AndroidMnanifest.xml 에 uses-permission을 추가한다.


여전히 빨간 줄이 있다. 지금 안드로이드 버전이 마시멜로우이므로, 실시간 권한 체크가 추가되어야 하기 때문이다.


5. 실시간 권한체크 구문을 작성한다. 권한을 요청하는 과정을 먼저 보자.






이 과정을 코드로 작성하면 다음과 같다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

package com.ktds.smahn.calladmissionapp;

import android.Manifest;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.net.Uri;

import android.os.Build;

import android.os.Bundle;

import android.support.annotation.NonNull;

import android.support.v4.app.ActivityCompat;

import android.support.v7.app.AlertDialog;

import android.support.v7.app.AppCompatActivity;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

   private Button button;

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       button = (Button) findViewById(R.id.button);

       button.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               /* 사용자의 OS 버전이 마시멜로우 이상인지 체크한다. */

               if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {

                   /* 사용자 단말기의 권한 중 "전화걸기" 권한이 허용되어 있는지 체크한다.

                   *  int를 쓴 이유? 안드로이드는 C기반이기 때문에, Boolean 이 잘 안쓰인다.

                   */

                   int permissionResult = checkSelfPermission(Manifest.permission.CALL_PHONE);

                   /* CALL_PHONE의 권한이 없을 때 */

                   // 패키지는 안드로이드 어플리케이션의 아이디다.( 어플리케이션 구분자 )

                   if (permissionResult == PackageManager.PERMISSION_DENIED) {

                       /* 사용자가 CALL_PHONE 권한을 한번이라도 거부한 적이 있는 지 조사한다.

                       * 거부한 이력이 한번이라도 있다면, true를 리턴한다.

                       */

                       if (shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {

                           AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);

                           dialog.setTitle("권한이 필요합니다.")

                                   .setMessage("이 기능을 사용하기 위해서는 단말기의 \"전화걸기\" 권한이 필요합니다. 계속하시겠습니까?")

                                   .setPositiveButton("네", new DialogInterface.OnClickListener() {

                                       @Override

                                       public void onClick(DialogInterface dialog, int which) {

                                           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

                                               requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);

                                           }

                                       }

                                   })

                                   .setNegativeButton("아니오", new DialogInterface.OnClickListener() {

                                       @Override

                                       public void onClick(DialogInterface dialog, int which) {

                                           Toast.makeText(MainActivity.this, "기능을 취소했습니다.", Toast.LENGTH_SHORT).show();

                                       }

                                   })

                                   .create()

                                   .show();

                       }

                       //최초로 권한을 요청할 때

                       else {

                           // CALL_PHONE 권한을 Android OS 에 요청한다.

                           requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);

                       }

                   }

                   /* CALL_PHONE의 권한이 있을 때 */

                   else {

                       Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:010-1111-2222"));

                       startActivity(intent);

                   }

               }

               /* 사용자의 OS 버전이 마시멜로우 이하일 떄 */

               else {

                   Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:010-1111-2222"));

                   startActivity(intent);

               }

           }

       });

   }

   /**

    * 사용자가 권한을 허용했는지 거부했는지 체크

    * @param requestCode   1000번

    * @param permissions   개발자가 요청한 권한들

    * @param grantResults  권한에 대한 응답들

    *                    permissions와 grantResults는 인덱스 별로 매칭된다.

    */

   @Override

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

       if (requestCode == 1000) {

           /* 요청한 권한을 사용자가 "허용"했다면 인텐트를 띄워라

               내가 요청한 게 하나밖에 없기 때문에. 원래 같으면 for문을 돈다.*/

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

               Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:010-1111-2222"));

               if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {

                   startActivity(intent);

               }

           }

           else {

               Toast.makeText(MainActivity.this, "권한 요청을 거부했습니다.", Toast.LENGTH_SHORT).show();

           }

       }

   }

}

Colored by Color Scripter

cs




코드 부가 설명

  • JNI : C에서 Java 코드가 돌아갈 수 있게 도와주는 것.


사용자가 스스로 거부할 권리를 마시멜로우부터 준 것이다. 즉 마시멜로우 전에는 requestPermissions가 없었다.

너가 만들고 있는 앱이 젤리빈이니까, 마시멜로우때만 돌아갈 수 있도록 경고창을 준 것이다.

사용자 OS가 마시멜로우 일떄만 동작할 수 있도록 도와주어야 한다.  고치면 아래와 같다.



6. 실행한다.








언제까지나 마시멜로우 하위 버전에서 안드로이드를 개발할 수 없다. 공부하는 개발자가 되쟈!!!



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함