티스토리 뷰
마시멜로부터 권한을 얻어오는 방식이 바뀌었다. 마시멜로가 나온지 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(); }
} } }
|
코드 부가 설명
JNI : C에서 Java 코드가 돌아갈 수 있게 도와주는 것.
사용자가 스스로 거부할 권리를 마시멜로우부터 준 것이다. 즉 마시멜로우 전에는 requestPermissions가 없었다.
너가 만들고 있는 앱이 젤리빈이니까, 마시멜로우때만 돌아갈 수 있도록 경고창을 준 것이다.
사용자 OS가 마시멜로우 일떄만 동작할 수 있도록 도와주어야 한다. 고치면 아래와 같다.
6. 실행한다.
언제까지나 마시멜로우 하위 버전에서 안드로이드를 개발할 수 없다. 공부하는 개발자가 되쟈!!!
'프로그래밍 > 안드로이드' 카테고리의 다른 글
네트워킹 - 웹으로 요청하기 (0) | 2016.06.13 |
---|---|
레이아웃이란? (0) | 2016.06.13 |
알림창 띄우기(Multi Choice, Single Choice) (0) | 2016.06.10 |
Activity 간 데이터 넘기기 실습 (0) | 2016.06.08 |
안드로이드 어플리케이션을 구성하는 4대 요소- 액티비티 (1) | 2016.06.08 |
- Total
- Today
- Yesterday
- jQuery
- er다이어그램
- 쿼리
- 제이쿼리
- mybatis
- 예외처리
- MVC
- JSP
- facebook 연동
- mongo db
- 뉴스피드 가져오기
- 글쓰기 버튼
- 메뉴바에 버튼 생성하기
- 뒤로가기 버튼
- 클래스
- 게시판 만들기
- spring
- 포스팅하기
- query
- Linear Layout
- sql
- 배열
- 메소드
- aop
- Relative Layout
- ERD
- activity
- intent
- 자바프로그래밍
- Erwin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |