programing

Android 6.0(Mashmallow)에서 특정 앱에 대한 권한 화면을 프로그래밍 방식으로 열려면 어떻게 해야 합니까?

newstyles 2023. 6. 28. 21:24

Android 6.0(Mashmallow)에서 특정 앱에 대한 권한 화면을 프로그래밍 방식으로 열려면 어떻게 해야 합니까?

새로운 안드로이드 6.0(마쉬멜로) 출시와 관련하여 질문이 있습니다.

의도 등을 통해 특정 앱에 대한 "앱 권한" 화면을 표시할 수 있습니까?

Android M Permission Screen

다음 코드로 설정에서 앱의 "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);

샘플 출력

enter image description here

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