Android Marshmallow의 서비스에서 권한을 요청하는 방법


101

Android Marshmallow에서 권한은 앱이 설치 될 때 한꺼번에 요청되는 것이 아니라 필요할 때 런타임에 요청되어야합니다. 그러나 내 앱에는 서비스 만 포함되어 있기 때문에 문제가되는 활동에서만 권한을 요청할 수 있습니다. (그 이유는 무엇입니까?이 앱에는 Android Wear 시계 모드가 번들로 포함되어 있으며 휴대 전화는 주변의 사진을 검색하여 시계로 전송하기 만하면됩니다. 활동이 필요하지 않습니다.하지만 위치 권한이 필요합니다.)

그렇다면 서비스에서 권한을 요청하는 방법이 있습니까? 아니면 과거와 같이 설치시 권한을 강제로 부여합니까?


이 문제는 내부 Application 클래스
itzhar

이것을 시도해보십시오. stackoverflow.com/a/41221852/5488468
Bipin Bharti

내 라이브러리는 모든 컨텍스트에서 런타임 권한을 쉽게 처리하고 "다시 묻지 않음"도 처리합니다. github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

답변:


47

requestPermission()단지에서 호출 할 수 Activity아닌 Service(달리 checkPermission()그에만 필요 PackageManager). 따라서이 문제를 해결하려면 추가 작업을 수행해야합니다. Activity예를 들어 앱에 를 제공해야 하며, 예를 들어 Service필요한 권한을 확인할 수 있으며 아직 부여되지 않은 경우 알림을 생성 할 수 있으며 사용자에게 그 이유를 설명하는 짧은 메시지로 알릴 수 있습니다. 알림 및 알림을 클릭 할 때 발생해야하는 작업 등


이것이 Benjamin Poiesz가 제안한 솔루션입니다 . 이들을 수 팟 캐스트를 23시 40분에서
샤오 미

조각 내에서 requestPermission ()을 호출 할 수도 있습니다.
Misagh Emamverdi 2015 년

3
위치 업데이트를 주기적으로 확인하고 설정에서 위치 권한을 끄는 백그라운드 서비스를 실행하는 경우에 대한 해결책은 무엇입니까? 활동이 없기 때문에 앱을 다시 열 때 서비스가 중단됩니다
stud91

1
@ stud91 최소한 위치 업데이트를 요청할 때마다 보안 예외 또는 쿼리 권한을 포착하십시오. 이렇게하면 앱이 다운되는 것을 방지 할 수 있습니다 (권한이 취소 된 경우 위치를 얻을 수는 없지만). 더 좋은 점은 권한을 확인하고 누락 된 경우 권한 대화 상자의 자리 표시자인 활동으로 사용자를 안내하는 알림을 표시하는 것입니다.
user149408

8
: 여기에 내가 그것을 해결 방법 github.com/mvglasow/satstat/blob/master/src/com/vonglasow/... 그것은 어떤에서 호출 할 수 Context도있는 구현 OnRequestPermissionsResultCallback. 기능은 표준과 유사합니다 requestPermission().
user149408

15

동의합니다. 이것은 서비스에 매우 번거 롭습니다. 이에 대한 문제는 Android 개발자 미리보기 페이지에보고해야한다고 생각합니다.

현재로서는 서비스에 대한 권한을 확인하고 권한이 없을 경우 알림을 표시하는 것이 최선의 해결책이라고 생각합니다. 더 좋은 방법은 사용자가 알림을 누를 때 권한을 요청하는 DialogActivity를 만드는 것입니다.


7

PermissionEverywhere 살펴보기 라이브러리를 . 모든 컨텍스트에서 권한을 요청할 수 있습니다.

클릭하면 권한을 요청하는 활동이 열리는 알림이 생성됩니다.

라이브러리 github 페이지의 샘플 코드 :-

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }

1
서비스에서 비동기 버전을 시도했지만 작동하지 않았습니다. onComplete를 호출되고 있지 않았다
레오 Droidcoder

좋은 생각이지만 저장소에서 사용할 수 없습니다
naXa

2
이 패키지는 제안에 감사드립니다. 그러나 나는 비동기 버전을 시도하지 않았다는 점에 주목할 것입니다. 또한를 사용하는 데 문제 PermissionEverywhere가있는 경우 매니페스트에서 도우미 활동을 선언하고 선언 할 때 올바른 패키지에 연결되어 있는지 확인하세요 ( PermissionEverywhere별도 패키지로 사용 하는 경우 ). 실제로 PermissionEverywhere매니페스트에 패키지를 지정하지 않았다는 사실을 깨닫는 데 오랜 시간이 걸렸습니다 .
user3570982 dec.

PermissionEverywhere의 데모 앱을 실행했는데 작동하지 않았습니다.
Ixx

2

이 작업을 정확하게 수행 할 수있는 매우 간단한 라이브러리가 있습니다. 앱이 포 그라운드인지 백그라운드인지에 따라 어디에서나 (서비스에서도) 권한을 확인할 수 있습니다. 일반 대화 상자를 표시하거나 권한을 요청하는 알림을 생성합니다. 코드는 정말 이해하기 쉽고 사용하기도 정말 쉽습니다.

시도해보세요 : Android 권한


-2

를 사용 ResultReceiver하여 사용자 응답의 수신자를 생성 한 다음 알림의를 통해 콜백으로 활동에 전달할 수 PendingIntent있습니다. 참고

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.