Android 권한을 선언해도 작동하지 않음
Android 앱에서 SMS를 보내기 위해 코드를 작성하려고 하는데 SMS를 보내려고 하면 다음 오류가 반환됩니다.
09-17 18:37:29.974 12847-12847/**.**.****E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: **.**.****, PID: 12847
java.lang.SecurityException: Sending SMS message: uid 10092 does not have android.permission.SEND_SMS.
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768)
at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:310)
at android.telephony.SmsManager.sendTextMessage(SmsManager.java:293)
at **.**.****.MainActivity$3.onClick(MainActivity.java:70)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
확인했지만 다음과 같이 매니페스트에 권한이 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-feature android:name="android.hardware.telephony"
android:required="true"/>
<application
android:exported="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
, 가 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★<uses-permission/>
아, 아, 아, 아, 아, 아, 아, 아, 아, 아?
당신의 큰 이유는 에 즘즘 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a가 있기 입니다.targetSdkVersion
23번, 23번, 23번입니다.Android 6.0 버전
ACCEPT_HANDOVER
ACCESS_BACKGROUND_LOCATION
ACCESS_MEDIA_LOCATION
ACTIVITY_RECOGNITION
ANSWER_PHONE_CALLS
ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ADD_VOICEMAIL
BODY_SENSORS
CALL_PHONE
CAMERA
GET_ACCOUNTS
PROCESS_OUTGOING_CALLS
READ_CALENDAR
READ_CALL_LOG
READ_CELL_BROADCASTS
READ_CONTACTS
READ_EXTERNAL_STORAGE
READ_PHONE_STATE
READ_SMS
RECEIVE_MMS
RECEIVE_SMS
RECEIVE_WAP_PUSH
RECORD_AUDIO
SEND_SMS
USE_SIP
WRITE_CALENDAR
WRITE_CALL_LOG
WRITE_CONTACTS
WRITE_EXTERNAL_STORAGE
권한에 는, 「 」 「 」 「 」 「 」 뿐만 , 「 」targetSdkVersion
은 23개 이상의 앱이 합니다.<uses-permission>
6.0+ 시 에게 Android 6.0+와 같은 해야 합니다.checkSelfPermission()
★★★★★★★★★★★★★★★★★」requestPermissions()
.
하던 것을 .targetSdkVersion
스물세 살 이하.
여러분은 의 마음을 가질 수 있을 입니다.targetSdkVersion
23 이상일 것.그 때 새로운 런타임 권한 시스템을 사용하기 위해 앱을 조정해야 합니다.Android 설명서에는 이 항목 전용 페이지가 있습니다.
API 레벨 23 이상에서는 다음과 같이 실용적으로 프로그래밍 방식으로 제공됩니다.
private static final int PERMISSION_REQUEST_CODE = 1;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.SEND_SMS)
== PackageManager.PERMISSION_DENIED) {
Log.d("permission", "permission denied to SEND_SMS - requesting it");
String[] permissions = {Manifest.permission.SEND_SMS};
requestPermissions(permissions, PERMISSION_REQUEST_CODE);
}
}
실용적으로 권한 요청(API 23 이후)
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.SEND_SMS)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// Ask for permision
ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.SEND_SMS}, 1);
}
else {
// Permission has already been granted
}
"앱에 권한이 있으면 checkSelfPermission() 메서드가 PERMISSION_GRANTED를 반환하고 앱은 작업을 계속할 수 있습니다.
앱에 권한이 없으면 메서드는 PERMISSION_DENIED를 반환하고 앱은 사용자에게 명시적으로 권한을 요청해야 합니다.위의 코드와 같이 사용자에게 해당 권한을 요구해야 합니다.request Permissions()를 호출하면 표준 Android 대화상자가 나타납니다.이 대화상자는 커스터마이즈할 수 없습니다.
아래 링크(https://developer.android.com/guide/topics/permissions/overview.html)를 참조해 주세요.
권한으로 시작하는 일부 샘플도 사용할 수 있습니다.
안드로이드를 보다 안전하게 하기 위해 개발자들은 이제 매니페스트에 허가를 언급해야 할 뿐만 아니라 실행 시간에도 작업을 완료하기 위해 사용자에게 요청해야 한다.아래에 언급된 위험 허가 섹션에 분류된 허가입니다.
캘린더
READ_CALENDAR
WRITE_CALENDAR
카메라
CAMERA
연락처
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
위치
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
마이크
RECORD_AUDIO
전화
READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS (must request at runtime)
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
ANSWER_PHONE_CALLS
센서
BODY_SENSORS
SMS
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
보관소
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
sdk 23 이상을 사용하는 경우 실행 시간 권한을 확인해야 합니다.
선언할 때permisson
에서Manifest
그리고 이것은 작업이 아님을 의미합니다.MarshMallow
및 을 위해MarshMallow
Permisson을 설정했습니다.RunTime
.
이렇게
ActivityCompat.requestPermissions();
문제를 해결하기 위해 MainActivity에 추가했습니다.
int MY_PERMISSIONS_REQUEST_READ_CONTACTS=0;
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Android 버전 "23" 또는 "23+"를 사용하는 경우 사용자의 권한이 필요한 항목에 액세스하려고 하면 앱에 오류가 표시됩니다.Android 매니페스트에서 권한을 선언한 경우에도 런타임에 권한을 요청해야 합니다.
https://developer.android.com/training/permissions/requesting.html 를 확인해 주세요.
하지만 어플리케이션 전체를 만들고 모든 장소에서 바꾸고 싶지 않다면 약간의 속임수로 충분합니다.
"Build.gradle" 파일로 이동하여 대상 Sdk 버전을 22, 21과 같이 23 미만으로 변경합니다.
공용과 함께웨어의 대답,
SMS 메시지 제한을 설정하기 위한 보안 설정(CM13에서 확인)이 있습니다.[없음(None)]으로 설정하면 런타임에 SMS_SEND 권한을 얻은 후에도 OS는 모든 SMS에 대해 [대화상자(Dialog)]를 팝업합니다.이 값을 최대로 설정하는 것이 가장 좋습니다.
최대값이 충분하지 않은 경우 루트 디바이스의 최대 환율을 높이는 방법이 있습니다.
외부 스토리지에 쓸 수 있는 솔루션도 유용했으면 합니다.
public boolean checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Timber.tag(LOG_TAG).e("Permission error. You have permission");
return true;
} else {
Timber.tag(LOG_TAG).e("Permission error. You have asked for permission");
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else {
// for a stuff below api level 23
Timber.tag(LOG_TAG).e("Permission error. You already have the permission");
return true;
}
}
이 코드를 사용하여 메시지에 액세스할 수 있습니다.
아래 코드를 사용하여 대화상자를 엽니다.
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
1);
활동 결과는 다음과 같습니다.
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
또는 파일 편집build.gradle
및 chanchanche numbertargetSdkVersion
보다 적은23
위의 코드는 필요 없습니다.
메모
물론 그렇지 않습니다. 교육적인 측면일 뿐입니다.
그래서 나는 메시지를 주고받을 수 있는 앱을 만들어야 했지만 권한이 부여되어도 보내기를 클릭할 때마다 보내기 동작이 중단되었다.실행 시 권한을 요청하고 허용했지만 프로세스가 요청된 SMS 전송 권한을 가지고 있지 않다는 크래시에 직면했습니다.에서 허가된 권한을 확인했습니다.
adb shell dumpsys package <package-name>
제가 허락을 요청한 순서는
- 수신_SMS
- 송신_SMS
나는 요청 순서를 되돌렸고, 그것은 잘 작동했다.이것은 완전히 새로운 앱으로 테스트되었습니다(uninstall-> install -> test).정답이 이상하게 보일 수 있지만 한번 시도해 보세요.
(표시된 대로 일정한 순서로 동작하면 Android에 버그가 있을 수 있습니다!!)
모든 권한 목록은 다음 URL에서 확인할 수 있습니다.
언급URL : https://stackoverflow.com/questions/32635704/android-permission-doesnt-work-even-if-i-have-declared-it
'programing' 카테고리의 다른 글
Vue 어레이에서 테이블로의 문제 (0) | 2022.08.28 |
---|---|
vuex 지속 상태가 전체적으로 변환으로 업데이트되지 않음 (0) | 2022.08.28 |
Vuex 저장소 변환에 어레이 커밋 (0) | 2022.08.24 |
암묵적 유형 승격 규칙 (0) | 2022.08.23 |
hashCode에 소수점을 사용하는 이유는 무엇입니까? (0) | 2022.08.23 |