Android 가 프로그램 이 실 행 될 때 권한 을 신청 하 는 실례 설명
<?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 에 들 어 갈 수 있 습 니 다.화면 은 그림 과 같 습 니 다.
여기 서 우 리 는 주어진 모든 위험 권한 을 닫 을 수 있다.
이상 의 안 드 로 이 드 가 프로그램 이 실 행 될 때 권한 을 신청 하 는 실례 설명 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.