development

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

big-blog 2020. 3. 15. 09:39
반응형

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


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

인 텐트 또는 이와 유사한 것을 통해 특정 앱에 대한 권한 화면을 표시 할 수 있습니까?

안드로이드 M 권한 화면

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

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

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


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

설정 페이지를 열려면

Intent intent = new Intent();
intent.setAction(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);
}

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


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


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

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

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

암호

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

샘플 출력

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


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

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

Martin Konecny 답변 기반


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

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

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


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

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

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

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


requestPermissions 메소드로 가능합니다

설정 페이지를 직접 볼 수는 없지만 액세스 권한을 변경할 수 있습니다.
좋은 예 :
https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

확인하고 전화 할 수있는 방법

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && 
   checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
{

                requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 0);

}

참고 URL : https://stackoverflow.com/questions/32822101/how-to-programmatically-open-the-permission-screen-for-a-specific-app-on-android

반응형