Android 가 프로그램 이 실 행 될 때 권한 을 신청 하 는 실례 설명

여기 서 우 리 는 전화 로 신청 할 수 있 는 권한 으로 작은 예 를 쓰 겠 습 니 다.즉,CALL 입 니 다.PHONE,전 화 를 걸 면 사용자 휴대 전화의 요금 문제 가 발생 하기 때문에 위험 권한 으로 분 류 됩 니 다.Android 6.0 시스템 이 나타 나 기 전에 전화 걸 기 기능 의 실현 은 매우 간단 합 니 다.activity 수정mainxml 의 코드 는 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.example.runtimepermissiontest.MainActivity">

 
 <Button
 android:id="@+id/make_call"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Make Call"
 android:textAllCaps="false"/>

</android.support.constraint.ConstraintLayout>
레이아웃 파일 에서 단 추 를 하나만 정 의 했 습 니 다.단 추 를 누 르 면 전 화 를 걸 수 있 는 논 리 를 실행 합 니 다.이 어 MainActivity 의 코드 를 수정 합 니 다.다음 과 같 습 니 다.

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Button makeCall = findViewById(R.id.make_call);
 makeCall.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  try {
   Intent intent = new Intent(Intent.ACTION_CALL);
   intent.setData(Uri.parse("tel:10000"));
   startActivity(intent);
  }catch (SecurityException e){
   e.printStackTrace();
  }
  }
 });
 }
}
버튼 의 클릭 이벤트 에서 우 리 는 암시 적 인 Intent 를 구축 하고 Intent 의 action 은 Intent.ACTION 으로 지정 한 것 을 볼 수 있 습 니 다.CALL,이것 은 시스템 에 내 장 된 전화 하 는 동작 입 니 다.그리고 data 부분 에서 협 의 를 tel 로 지 정 했 습 니 다.번 호 는 10000 이 고 전화 걸 기 인터페이스 를 여 는 것 을 표시 합 니 다.이것 은 권한 을 설명 할 필요 가 없 는 것 이 고 Intent.ACTION 입 니 다.CALL 은 직접 전 화 를 걸 수 있 기 때문에 권한 을 밝 혀 야 합 니 다.또한 프로그램 붕 괴 를 방지 하기 위해 모든 작업 을 이상 캡 처 코드 블록 에 넣 었 습 니 다.
다음은 AndroidManifest.xml 파일 을 수정 하고 다음 권한 을 설명 합 니 다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.runtimepermissiontest">

 <uses-permission android:name="android.permission.CALL_PHONE" />
 
 <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">
 <activity android:name=".MainActivity">
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>
 </application>

</manifest>
이렇게 하면 우 리 는 전 화 를 걸 수 있 는 기능 을 실현 하고 Android 6.0 시스템 보다 낮은 핸드폰 에서 정상적으로 작 동 할 수 있 습 니 다.그러나 만약 에 우리 가 6.0 또는 더 높 은 버 전 시스템 의 핸드폰 에서 실행 된다 면 Make Call 단 추 를 누 르 면 아무런 효과 가 없습니다.이때 logcat 의 로 그 를 관찰 하면 다음 과 같은 오 류 를 보고 할 수 있 습 니 다.

오류 정보 에서 Permission Denial 을 알 수 있 듯 이 권한 이 금지 되 어 발생 한 것 입 니 다.6.0 이상 의 시스템 이 위험 권 을 사용 할 때 실행 할 때 권한 처 리 를 해 야 하기 때 문 입 니 다.
그러면 이 문 제 를 복구 하고 MainActivity 의 코드 를 수정 해 보 겠 습 니 다.다음 과 같 습 니 다.

public class MainActivity extends AppCompatActivity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 Button makeCall = findViewById(R.id.make_call);
 makeCall.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
   ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
  }else {
   call();
  }
  }
 });
 }
 
 private void call(){
 try {
  Intent intent = new Intent(Intent.ACTION_CALL);
  intent.setData(Uri.parse("tel:10000"));
  startActivity(intent);
 }catch (SecurityException e){
  e.printStackTrace();
 }
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 switch (requestCode){
  case 1:
  if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
   call();
  }else {
   Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();
  }
  break;
  default:
   break;
 }
 }
}
위의 코드 는 실행 권한 의 완성 절 차 를 모두 덮어 씁 니 다.다음은 구체 적 으로 분석 하 겠 습 니 다.다시 말 하면 실행 할 때 권한 의 핵심 은 프로그램 이 실행 되 는 과정 에서 사용자 가 권한 을 부여 하여 일부 위험 조작 을 수행 하 는 것 입 니 다.프로그램 은 제멋대로 이 위험 조작 을 수행 할 수 없습니다.따라서...첫 번 째 단 계 는 사용자 가 우리 에 게 권한 을 수 여 했 는 지 아 닌 지 를 판단 하 는 것 입 니 다.ContextCompat.checkSelfPermission()방법 을 빌려 checkSelfPermission()방법 은 두 개의 인 자 를 받 습 니 다.첫 번 째 인 자 는 Context 입 니 다.이것 은 말 할 것 이 없습니다.두 번 째 인 자 는 구체 적 인 권한 이름 입 니 다.예 를 들 어 전 화 를 걸 수 있 는 권한 이름 은 Manifest.permission.CALL 입 니 다.PHONE,그리고 사용 방법의 반환 값 과 packageManager.PERMISSIONCRANTED 를 비교 하면 사용자 가 권한 을 수 여 했 음 을 나타 내 고 기다 리 지 않 으 면 사용자 가 권한 을 수 여 받 지 않 았 음 을 나타 낸다.
권한 이 부여 되 었 다 면 간단 합 니 다.전 화 를 걸 수 있 는 논리 적 조작 을 직접 수행 하면 됩 니 다.여기 서 저 희 는 전 화 를 걸 수 있 는 논 리 를 콜()방법 에 밀봉 합 니 다.권한 이 부여 되 지 않 았 다 면 Activity Compat.requestPermissions()방법 으로 사용자 에 게 권한 을 신청 하고 requestPermissions()방법 으로 3 개의 인 자 를 받 아야 합 니 다.첫 번 째 매개 변 수 는 Activity 의 인 스 턴 스 이 고 두 번 째 매개 변 수 는 String 배열 입 니 다.우 리 는 신청 할 권한 이름 을 배열 에 두 면 됩 니 다.세 번 째 매개 변 수 는 요청 코드 입 니 다.유일한 값 이면 됩 니 다.여기 서 1 을 입력 합 니 다.
requestPermissions()방법 을 호출 한 후에 시스템 은 신청 권한 의 대화 상 자 를 팝 업 한 다음 에 사용 자 는 우리 의 권한 신청 에 동의 하거나 거절 할 수 있 습 니 다.어떤 결과 든 최종 적 으로 onRequestPermissions Result()방법 으로 되 돌아 가 고 권한 을 수 여 받 은 결 과 는 grantResults 파라미터 에 봉 인 됩 니 다.여기 서 우 리 는 마지막 권한 수여 결 과 를 판단 해 야 합 니 다.사용자 가 동의 하면 콜()방법 으로 전 화 를 걸 고 사용자 가 거절 하면 조작 을 포기 하고 실패 알림 을 팝 업 할 수 밖 에 없습니다.
이제 프로그램 을 다시 실행 하고 Make Call 단 추 를 누 르 십시오.효 과 는 그림 과 같 습 니 다.
 
사용자 가 우리 에 게 전화 할 수 있 는 권한 을 부여 한 적 이 없 기 때문에 첫 번 째 실행 은 이러한 권한 신청 대화 상 자 를 팝 업 합 니 다.사용 자 는 동의 하거나 거절 할 수 있 습 니 다.예 를 들 어 여기 서 DENY 를 클릭 했 습 니 다.결 과 는 그림 과 같 습 니 다.

사용자 가 권한 을 부여 하 는 것 에 동의 하지 않 았 기 때문에 저 희 는 작업 실패 알림 만 팝 업 할 수 있 습 니 다.다음은 Make Call 을 다시 누 르 면 권한 신청 대화 상 자 를 팝 업 할 수 있 습 니 다.이번 에는 ALLOW 를 누 르 면 그림 과 같 습 니 다.

보 실 수 있 습 니 다.이번에 우 리 는 전화 걸 기 인터페이스 에 성공 적 으로 들 어 갔 습 니 다.그리고 사용자 가 권한 수여 작업 을 완 료 했 기 때문에 나중에 Make Call 단 추 를 누 르 면 권한 신청 대화 상 자 를 다시 꺼 내지 않 고 직접 전 화 를 걸 수 있 습 니 다.그러면 걱정 하 실 수 있 습 니 다.만약 에 나중에 제 가 후회 하면 어떻게 합 니까?상관 없습니다.사용 자 는 언제든지 프로그램의 위험 권한 을 부여 하여 관 계 를 진행 할 수 있 습 니 다.Settings->Apps->Runtime PermissiontTest-->Permissions 에 들 어 갈 수 있 습 니 다.화면 은 그림 과 같 습 니 다.

여기 서 우 리 는 주어진 모든 위험 권한 을 닫 을 수 있다.
이상 의 안 드 로 이 드 가 프로그램 이 실 행 될 때 권한 을 신청 하 는 실례 설명 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기