Android 6.0(Mashmallow)에서 특정 앱에 대한 권한 화면을 프로그래밍 방식으로 열려면 어떻게 해야 합니까?
새로운 안드로이드 6.0(마쉬멜로) 출시와 관련하여 질문이 있습니다.
의도 등을 통해 특정 앱에 대한 "앱 권한" 화면을 표시할 수 있습니까?
다음 코드로 설정에서 앱의 "App Info" 화면을 표시할 수 있습니다.
startActivity(
new Intent(
android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null)
)
);
앱의 "앱 권한" 화면을 직접 열 수 있는 유사한 솔루션이 있습니까?
저는 이미 이것에 대해 조사를 했지만 해결책을 찾을 수 없었습니다.
공식 Mashmallow 권한 비디오(4m 43s 마크)에 따르면, 대신 애플리케이션 설정 페이지를 열어야 합니다(여기서 한 번 클릭하면 권한 페이지가 나옵니다).
설정 페이지를 열려면 다음을 수행합니다.
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
이것은 불가능합니다.저도 그렇게 하려고 노력했어요.패키지 이름과 시작할 활동을 알 수 있었습니다.그러나 선언할 수 없는 권한 누락으로 인해 보안 예외가 발생합니다.
다른 답변에 대해서도 앱 설정 화면을 여는 것을 추천합니다.다음 코드로 이 작업을 수행합니다.
public static void startInstalledAppDetailsActivity(final Activity context) {
if (context == null) {
return;
}
final Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);
}
기록 스택에 이것을 추가하고 싶지 않기 때문에 인텐트 플래그를 사용하여 제거합니다.
코틀린 버전:
val intent = Intent(ACTION_APPLICATION_DETAILS_SETTINGS)
with(intent) {
data = Uri.fromParts("package", requireContext().packageName, null)
addCategory(CATEGORY_DEFAULT)
addFlags(FLAG_ACTIVITY_NEW_TASK)
addFlags(FLAG_ACTIVITY_NO_HISTORY)
addFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
}
startActivity(intent)
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
묘사
Settings.ACTION_APPLICATION_DETAILS_SETTINGS
앱에 대한 세부 정보 설정 페이지를 엽니다.여기서 사용자는 원하는 권한을 수동으로 할당해야 합니다.
Intent.FLAG_ACTIVITY_NEW_TASK
선택적.설정된 경우 설정 화면(활동)을 새 활동으로 엽니다.그렇지 않으면 현재 실행 중인 활동에서 열립니다.
Uri.fromParts("package", getPackageName(), null)
URI를 준비하거나 생성하지만 getPackageName() - 응용 프로그램 패키지의 이름을 반환합니다.
intent.setData(uri)
설정하는 것을 잊지 마십시오.그렇지 않으면, 당신은 받을 것입니다. android.content.ActivityNotFoundException
당신의 의도를 다음과 같이 설정했기 때문입니다. Settings.ACTION_APPLICATION_DETAILS_SETTINGS
Android는 검색할 이름을 기대합니다.
코드를 적게 작성하려면Kotlin
다음을 수행할 수 있습니다.
fun Context.openAppSystemSettings() {
startActivity(Intent().apply {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
data = Uri.fromParts("package", packageName, null)
})
}
대신 특정 앱의 일반 설정을 한 줄로 열 수 있습니다.
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
코틀린 스타일.
startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
})
Android 11부터는 다음과 같은 코드를 사용하여 위치 권한에 대한 앱별 설정 페이지를 직접 표시할 수 있습니다.requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), PERMISSION_REQUEST_BACKGROUND_LOCATION)
그러나 위의 작업은 한 번만 수행됩니다.사용자가 권한을 거부하거나 실수로 화면을 해제하는 경우 앱은 이를 다시 표시하도록 트리거할 수 없습니다.
위의 내용을 제외하고, 답변은 Android 11 이전과 동일합니다. 앱별 설정 페이지를 열고 사용자에게 두 단계를 수동으로 드릴다운하여 적절한 권한을 활성화하도록 요청하는 것이 최선입니다.
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri: Uri = Uri.fromParts("package", packageName, null)
intent.data = uri
// This will take the user to a page where they have to click twice to drill down to grant the permission
startActivity(intent)
여기에서 제 관련 질문을 참조하십시오. Android 11 사용자는 백그라운드 위치 권한을 부여할 수 없습니까?
권한 화면을 프로그래밍 방식으로 열 수 없습니다.대신 앱 설정 화면을 열 수 있습니다.
코드
Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
startActivity(i);
샘플 출력
Android를 형성하는 Xamarin:
//---------------------------------------------------------
public void OpenSettings()
//---------------------------------------------------------
{
var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings,
Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
Forms.Context.StartActivity(intent);
}
이것이 당신에게 도움이 될 수도 있습니다.
private void openSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 101);
}
우리가 플림(메이즈)만을 말하는 것이라면, 그것은 권한이 있는 자체 보안 앱을 가지고 있습니다.
다음을 사용하여 열 수 있습니다.
public static void openFlymeSecurityApp(Activity context) {
Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("packageName", BuildConfig.APPLICATION_ID);
try {
context.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
물론 BuildConfig는 앱의 BuildConfig입니다.
인 코틀린
/*
*
* To open app notification permission screen instead of setting
* */
fun Context.openAppNotificationSettings() {
val intent = Intent().apply {
when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
}
else -> {
action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
addCategory(Intent.CATEGORY_DEFAULT)
data = Uri.parse("package:" + packageName)
}
}
}
startActivity(intent)
}
위의 것은 테스트되고 작동 코드입니다. 도움이 되기를 바랍니다.
특정 앱에 대한 권한 화면 열기
if (ContextCompat.checkSelfPermission(
context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED
) {
//Permission is not granted yet. Ask for permission.
val alertDialog = AlertDialog.Builder(context)
alertDialog.setMessage(context.getString(R.string.file_permission))
alertDialog.setPositiveButton("सेटिंग") { _, _ ->
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", BuildConfig.APPLICATION_ID, null)
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
alertDialog.setNegativeButton("हाँ") { _, _ ->
ActivityCompat.requestPermissions(
context as Activity, arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE
), 1
)
}
alertDialog.show()
} else {}
실질적으로 권한을 얻을 수 없습니다...하지만 그 코드 라인을 try{} catch{}에 넣는 것을 제안합니다. 이것은 유감스럽게도 당신의 앱을 멈추게 합니다.
그리고 캡처 본문에서 대화 상자를 만들어 사용자를 작은 튜토리얼로 이동시켜 다른 앱의 권한에 대한 그리기를 활성화합니다.버튼에서 이 코드를 추가합니다...
Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(callSettingIntent);
이 목적은 권한을 관리하기 위해 다른 앱에 대한 추첨 목록을 직접 연 다음 여기서 한 번 클릭하면 다른 앱의 권한에 대한 추첨이 이루어집니다.
이게 당신이 찾는 답이 아니라는 걸 알아요하지만 앱에서 이걸 하고 있어요
Android 설명서에 따르면
사용해 보십시오.
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName(appDetails.packageName,"com.android.packageinstaller.permission.ui.ManagePermissionsActivity"));
startActivity(intent);
언급URL : https://stackoverflow.com/questions/32822101/how-can-i-programmatically-open-the-permission-screen-for-a-specific-app-on-andr
'programing' 카테고리의 다른 글
내가 하는 일은 커밋을 지우는 것뿐인데 git-rebase에서 병합 충돌이 발생하는 이유는 무엇입니까? (0) | 2023.06.28 |
---|---|
Oracle SQL 피벗 쿼리 (0) | 2023.06.28 |
동일한 그래프에서 ggplot2를 사용하여 두 변수를 선으로 표시 (0) | 2023.06.28 |
각 사용자를 Firebase의 데이터에 연결하려면 어떻게 해야 합니까? (0) | 2023.06.23 |
코드 우선 마이그레이션을 사용하여 SQL 스크립트를 실행할 수 있습니까? (0) | 2023.06.23 |