program story

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

inputbox 2020. 8. 24. 08:18
반응형

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


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

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


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


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

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


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
      }
  }

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

시도해보세요 : Android 권한


@SuppressLint("NewApi")
public void checkPerm() 
{
   locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

   if ( checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
      return;
   }

   locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {....}
}

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

참고 URL : https://stackoverflow.com/questions/32292675/how-to-request-permissions-from-a-service-in-android-marshmallow

반응형