Android Marshmallow에서 특정 앱의 권한 화면을 프로그래밍 방식으로 여는 방법은 무엇입니까?


330

새로운 Android Marshmallow 릴리스에 대한 질문이 있습니다.

의도 또는 유사한 것을 통해 특정 앱에 대한 권한 화면을 표시 할 수 있습니까?

안드로이드 M 권한 화면

다음 코드로 앱 설정을 표시 할 수 있습니다-권한 화면을 직접 여는 아날로그 솔루션이 있습니까?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null)));

나는 이미 이것에 대한 연구를했지만 적절한 해결책을 찾지 못했습니다. 모든 도움을 주셔서 감사합니다!


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

답변:


443

Marshmallow의 공식 권한 비디오 ( 4m 43s 표시 )에 따르면 대신 응용 프로그램 설정 페이지를 열어야합니다 (한 번의 클릭으로 권한 페이지로 이동).

설정 페이지를 열려면

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);

12
응용 프로그램 화면의 일반 세부 정보로 리디렉션됩니다. 구체적으로 앱 권한 화면으로 이동하는 방법 한 번의 클릭으로도 남는 것을 원하지 않습니다.
Milind Mevada

5
@MilindMevada-지금은 할 수 없습니다.
Martin Konecny

인 텐트를 사용하여 "실시간"으로 설정 활동에서 활동으로 데이터를 보낼 수 있습니까? 문제 메신저 직면는 활동이 데이터를 처리 하면 이 설정에서 전송되었다.
ThunderWiring

앱을 디버깅 할 때 작동하지만 APK에 서명 한 후 실제 이유없이 충돌합니다. logcat에서도 분명한 것은 없습니다.
JCutting8

181

이건 불가능 해. 나도 그렇게 했어요. 패키지 이름과 시작할 활동을 알아낼 수있었습니다. 그러나 결국 권한이 없기 때문에 선언 할 수없는 보안 예외가 발생합니다.

최신 정보:

다른 답변과 관련하여 앱 설정 화면을 여는 것이 좋습니다. 다음 코드 로이 작업을 수행합니다.

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

내 기록 스택에이를 원하지 않기 때문에 의도 플래그를 사용하여 제거합니다.


나는 해결 방법 /이 또 다른 솔루션 ...있을 수 있습니다 같은 경험과 생각 : - /
프레데릭 Schweiger

안타깝게도 설계 상으로는 불가능합니다. 자세한 내용은 Google+에서이 토론을 확인하십시오. goo.gl/Wqjjff
Frederik Schweiger

1
@Mulgard Whatsapp는 targetSdk = "23"을 사용해야합니다. 이를 통해 앱은 사용자에게 권한을 활성화하라는 메시지를 표시 할 수 있습니다. 대상 SDK <23 인 경우 사용자에게 앱 권한 화면을 표시 할 수있는 것이 유용하지만 일반적인 앱 설정 화면 만 표시하는 것처럼 보입니다.
vman

4
설정 화면에 팝업이 표시되면 Intent.FLAG_ACTIVITY_NO_HISTORY가 태블릿에 문제가 발생할 수 있으며 설정 화면을 닫습니다. 해당 플래그를 제거하면이 문제가 해결됩니다.
Wirling

2
사용자에게 "허가"로 이동하도록 지시하는 동시에 토스트를 표시 할 수 있습니다 (사용자의 언어로 나머지 앱을 사용할 수없는 경우에도이 메시지를 현지화하는 것이 좋습니다)
vgergo

81
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 안드로이드는 어떤 이름을 검색 할 것으로 기대합니다.


이것은 말 그대로 최고 투표 답변입니다. 왜 이것을 복제하고 원래 답변을 확장하지 않습니까?!
토마스 켈러

1
자세한 설명에 감사드립니다.
David Refoua

34

대신 한 줄로 특정 앱의 일반 설정을 열 수 있습니다

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));

빌드 구성 방법에 따라 getActivity (). getPackageName ()을 사용하여 패키지 이름을 가져올 수 있습니다.
Cory Roy

15

프로그래밍 방식으로 권한 화면을 열 수 없습니다. 대신 앱 설정 화면을 열 수 있습니다.

암호

Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
startActivity(i);

샘플 출력

여기에 이미지 설명을 입력하십시오


1
그는 허가 페이지를 요구하고있다
Maveň ツ

10

더 적은 코드를 작성 Kotlin하려면 다음을 수행하십시오.

fun Context.openAppSystemSettings() {
    startActivity(Intent().apply {
        action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
        data = Uri.fromParts("package", packageName, null)
    })
}

Martin Konecny 답변 기반


Kotin 확장 기능 사용
David Jarvis

7

코 틀린 스타일.

    startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
        data = Uri.fromParts("package", packageName, null)
    })

5

이것이 당신을 도울 것입니다

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

3

FLYME OS (Meizu)에 대해서만 이야기하는 경우 권한이있는 자체 보안 앱이 있습니다.

그것을 열려면 다음 의도를 사용하십시오.

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 입니다.


3

Xamarin Forms Android :

//---------------------------------------------------------
public void OpenSettings()
//---------------------------------------------------------
{
    var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings,
        Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
    Forms.Context.StartActivity(intent);
}

0

실용적으로 권한을 얻는 것은 불가능 합니다 ...하지만 코드를 try {} catch {}에 넣어서 앱을 불행히도 중지시키는 것은 좋지 않습니다. catch body에서는 대화 상자를 만들어 다른 응용 프로그램에 대한 그리기 권한을 사용하도록 설정하는 작은 자습서-사용자 ... 예 버튼을 클릭하면이 코드를 넣습니다 ...

 Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivity(callSettingIntent);

이 의도는 권한을 관리하기 위해 다른 앱대한 그리기 목록직접 열고 다음부터는 한 번의 클릭으로 다른 앱에 대한 그리기 권한입니다 ... 나는 이것이 당신이 찾고있는 대답이 아니라는 것을 알고 있습니다 ...하지만 내 앱 에서이 작업을 수행 중입니다 ...

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