# Android의 3개의 부동 창:권한
19667 단어 androidpermissionsfloatingkotlin
나는 Floating Apps의 저자이다.구글플레이에서 동종 앱 최초로 다운로드 800만 뷰를 넘긴 가장 인기 있는 앱이다.6년간의 응용 개발을 거쳐 나는 그것에 대해 어느 정도 알고 있다.때때로 나는 몇 달 동안 문서와 안드로이드 소스 코드를 읽고 실험을 했다.나는 수만 명의 사용자의 피드백을 받았고, 서로 다른 버전의 안드로이드 휴대전화에서 각양각색의 문제를 보았다.
다음은 내가 가는 길에 배운 것이다.
본문을 읽기 전에 먼저 읽는 것을 권장합니다Floating Windows on Android 2: Foreground Service.
본고에서, 나는 사용자에게 부동 기술 작업에 필요한 특수 허가를 요청하는 방법을 가르쳐 드리겠습니다.
시스템 경고 창
부동 기술이 역할을 발휘하기 위해서는
SYSTEM_ALERT_WINDOW
에서 정의AndroidManifest.xml
가 필요하다.이 행을 추가하면 충분합니다.<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
이 권한은 처음에는 시스템 창을 표시하는 메커니즘인 작은 알림, 오류 메시지, 실행 중인 호출 덮어쓰기 등을 제공하기 위해서였습니다. 그러나 조금만 노력하면 부동 창에 사용할 수 있습니다.기타 애플리케이션 활용
앞의 수정 절차
AndroidManifest.xml
는 부족하다.플로팅 창을 표시하려면 Draw over라는 특수 권한이 필요합니다.어떤 휴대전화에서는, 그것은 다른 명칭이 있을 수 있다.예를 들어 일부 샤오미 휴대전화에서는 팝업 권한이다.이것은 특수한 권한이기 때문에, 우리는 사용자를 휴대전화 설정의 특정 화면을 가리키며 수동으로 사용해야 한다.다행히도 권한 상태를 검사하여 사용자로부터 권한을 요청하는 합리적인 논리를 실현할 수 있는 방법이 있다.
앞으로 언제든지 이 앱의 허가가 취소될 수 있으므로 정기적인 검사가 필요하다는 것을 명심하세요.그래서 허가를 요청하기 위해 이벤트를 만듭니다.우리는 다른 행사와 프론트 데스크 서비스로부터 이 활동을 어디에서든 시작할 수 있다.
우선, 권한이 부여되었는지 확인하기 위해 두 개의 작은 조수 방법을 추가합시다
fun Context.drawOverOtherAppsEnabled(): Boolean {
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
true
} else {
Settings.canDrawOverlays(this)
}
}
fun Context.startPermissionActivity() {
startActivity(
Intent(this, PermissionActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
)
}
이 두 가지 방법을 사용하면 앞에서 소개한 onStartCommand
방법FloatingService
에 권한 검사를 추가할 수 있다.override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
// ...unrelated code omitted for brevity...
// Show the floating window for adding a new note.
if (command == INTENT_COMMAND_NOTE) {
if (!drawOverOtherAppsEnabled()) {
startPermissionActivity()
} else {
Toast.makeText(
this,
"Floating window to be added in the next lessons.",
Toast.LENGTH_SHORT
).show()
}
}
return START_STICKY
}
물론, 우리는 우리의 새로운 활동을 AndroidManifest.xml
에 추가해야 한다.별도의 간호가 필요 없다.<activity android:name=".PermissionActivity" />
마지막으로 권한 활동의 전체 소스 코드는 다음과 같습니다.const val PERMISSION_REQUEST_CODE = 1
class PermissionActivity : AppCompatActivity() {
private fun showDialog(titleText: String, messageText: String) {
with(AlertDialog.Builder(this)) {
title = titleText
setMessage(messageText)
setPositiveButton(R.string.common_ok) { dialog, _ ->
dialog.dismiss()
}
show()
}
}
@RequiresApi(Build.VERSION_CODES.M)
private fun requestPermission() {
val intent = Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:$packageName")
)
try {
startActivityForResult(intent, PERMISSION_REQUEST_CODE)
} catch (e: Exception) {
showDialog(
getString(R.string.permission_error_title),
getString(R.string.permission_error_text)
)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Column {
Text(
text = getString(R.string.permission_required_title),
fontSize = 16.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(16.dp, 16.dp, 16.dp, 8.dp)
)
Text(
text = getString(R.string.permission_required_text),
modifier = Modifier.padding(16.dp, 4.dp)
)
Button(
onClick = {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
finish()
} else {
requestPermission()
}
},
modifier = Modifier.padding(16.dp, 8.dp)
) {
Text(text = getString(R.string.permission_required_open))
}
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
// Don't check for resultCode == Activity.RESULT_OK because the overlay activity
// is closed with the back button and so the RESULT_CANCELLED is always received.
if (requestCode == PERMISSION_REQUEST_CODE) {
if (drawOverOtherAppsEnabled()) {
// The permission has been granted.
// Resend the last command - we have only one, so no additional logic needed.
startFloatingService(INTENT_COMMAND_NOTE)
finish()
}
} else {
super.onActivityResult(requestCode, resultCode, data)
}
}
}
안드로이드 5 이상
위의 모든 내용은 Android 6 및 업데이트 릴리즈에서 유효합니다.안드로이드 5와 더 빠른 장치에는 권한 상태를 얻는 메커니즘도 없고 사용자에게 권한을 부여하도록 요구하는 표준 메커니즘도 없다.
내 경험에 따르면 대부분의 오래된 장치에서는 기본적으로 권한이 활성화됩니다.그리고 안드로이드 5는 이제 충분히 유행이 지났으니 문제없다.
부동 응용 프로그램의 첫 번째 버전은 당시의 최신 안드로이드 2.3.3을 위해 개발된 것이다. 안드로이드6가 인수하기 전에 이것은 우리에게 약간 고통스러웠다. -).
지원되지 않는 장치
이 권한은 일부 장치에서는 액세스할 수 없으며 ADB를 통해서만 사용할 수 있습니다.또한 일부 맞춤형 ROM에도 적용됩니다.
이 밖에 일부 특정 장치, 예를 들어 안드로이드 텔레비전 카트리지에서는 이 허가를 아예 받지 못할 수도 있고 플로팅 기술도 작동하지 못할 수도 있다.
그러나 이것은 내가 약 11만 대의 다른 장치에서 부동 응용 프로그램을 실행한 경험으로 다른 응용 프로그램에 비해 기본적으로 문제가 없다.그러니까 너무 걱정하지 마세요.
결실
다음 애니메이션에서는 라이센스를 획득하는 방법을 보여 줍니다.
소스 코드
본문의 모든 소스 코드는 available on Github입니다.
기대 많이 해주세요.
안드로이드 개발에 대한 더 많은 정보를 원하십니까?트위터에서 나()와 로컬레이지(Localazy), 혹은 유사한Localazy on Facebook을 팔로우한다.
시리즈
이 문서는 Android 시리즈 부동 창의 일부입니다.
Reference
이 문제에 관하여(# Android의 3개의 부동 창:권한), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/localazy/3-floating-windows-on-android-permissions-256g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)