Como abrir programaticamente a Tela de permissão para um aplicativo específico no Android Marshmallow?

330

Tenho uma pergunta sobre o novo lançamento do Android Marshmallow:

É possível exibir a tela de permissão para um aplicativo específico por meio de um Intent ou algo semelhante?

Tela de permissão do Android M

É possível exibir as configurações do aplicativo com o seguinte código - existe uma solução analógica para abrir diretamente a tela de permissão?

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

Eu já fiz alguma pesquisa sobre isso, mas não consegui encontrar uma solução adequada - eu agradeceria toda ajuda!

Frederik Schweiger
fonte
Tente isso, pode ser trabalho stackoverflow.com/a/41221852/5488468
Bipin Bharti 1 /

Respostas:

443

De acordo com o vídeo oficial de permissões do Marshmallow (na marca dos 4m 43s ), você deve abrir a página Configurações do aplicativo (a partir daí há um clique na página Permissões).

Para abrir a página de configurações, você faria

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
Martin Konecny
fonte
12
Ele está redirecionando para detalhes gerais da tela do aplicativo. Como pode ir especificamente para a tela Permissões do aplicativo. Eu não quero que permanecer um clique também,
Milind Mevada
5
@MilindMevada - você não pode fazer isso no momento.
Martin Konecny
você poderia enviar dados da atividade de configurações para sua atividade usando intenções, em "tempo real"? o problema que estou enfrentando é lidar com esses dados em sua atividade depois que eles são enviados pelas configurações.
ThunderWiring
Isso funciona durante a depuração do aplicativo, mas falha sem motivo real após a assinatura do APK. Nada óbvio no logcat também.
precisa saber é o seguinte
181

Isso não é possível. Eu tentei fazer isso também. Eu poderia descobrir o nome do pacote e a atividade que será iniciada. Mas, no final, você receberá uma exceção de segurança devido à falta de permissão que não pode declarar.

ATUALIZAR:

Em relação à outra resposta, também recomendo abrir a tela de configurações do aplicativo. Eu faço isso com o seguinte código:

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

Como não quero ter isso na minha pilha de histórico, removo-o usando sinalizadores de intenção.

Thomas R.
fonte
Eu experimentei o mesmo e pensei que poderia haver uma solução alternativa / outra solução para isso ...: - /
Frederik Schweiger
Não, infelizmente não é possível por design. Para mais informações, consulte esta discussão no Google+: goo.gl/Wqjjff
Frederik Schweiger
1
@Mulgard O Whatsapp deve estar usando targetSdk = "23". Isso permite que o aplicativo solicite ao usuário que habilite a permissão. Se o seu SDK de destino <23, poder mostrar ao usuário a tela de permissões do aplicativo é útil, parece que só podemos mostrar a tela de configurações gerais do aplicativo.
Vman
4
Às vezes, o Intent.FLAG_ACTIVITY_NO_HISTORY pode causar uma situação problemática nos tablets quando um pop-up é exibido na tela de configurações, ele fecha a tela de configurações. Simplesmente remover esse sinalizador resolverá esse problema.
Agitando 15/11
2
Você pode mostrar um Toast ao mesmo tempo instruindo o usuário a entrar em "Permissão" (boa idéia para localizar esta mensagem mesmo que o restante do seu aplicativo não esteja disponível no idioma do usuário)
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);

Descrição Abre a página de configuração Detalhes para o aplicativo. A partir daqui, o usuário precisa atribuir manualmente a permissão desejada.

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
  

Intent.FLAG_ACTIVITY_NEW_TASK
   Opcional . Se definido, abre a tela Configurações (atividade) como nova atividade. Caso contrário, ele será aberto na atividade em execução no momento.

Uri.fromParts("package", getPackageName(), null)
   Prepara ou cria URI, enquanto getPackageName () - retorna o nome do seu pacote de aplicativos.

intent.setData(uri)
   Não se esqueça de definir isso . Caso contrário, você receberá android.content.ActivityNotFoundException . Como você definiu sua intenção como Settings.ACTION_APPLICATION_DETAILS_SETTINGS e o Android espera que algum nome seja pesquisado.

singhpradeep
fonte
É literalmente essa a resposta mais votada. Por que duplicar isso e não estender a resposta original ?!
Thomas Keller
1
Obrigado pela explicação detalhada.
David Refoua 20/10/19
34

Em vez disso, você pode abrir as configurações gerais de aplicativos específicos com uma linha

 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));
dgngulcan
fonte
Você pode usar getActivity (). GetPackageName () para obter o nome do pacote, dependendo de como sua compilação está configurada.
Cory Roy
15

Não é possível abrir programaticamente a tela de permissão. Em vez disso, podemos abrir a tela de configurações do aplicativo.

Código

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

Saída de amostra

insira a descrição da imagem aqui

Vignes
fonte
1
Ele está solicitando a página de permissão
Maveňň
10

Se você deseja escrever menos código, Kotlinpode fazer o seguinte:

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

Baseado na resposta de Martin Konecny

Ultimo_m
fonte
bom uso de extensões Kotin
David Jarvis
8

Estilo Kotlin.

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

Pode ser que isso ajude você

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);
}
Sandeep Kumar
fonte
3

Se estamos a falar de Flyme OS (Meizu) SOMENTE há o seu próprio aplicativo de segurança com permissões.

Para abri-lo, use a seguinte intenção:

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

De-causa BuildConfig é do seu aplicativo BuildConfig .

Daniel
fonte
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);
}
Nick Kovalsky
fonte
0

não é possível obter de forma pragmática a permissão ... mas sugerirei que você coloque essa linha de código em try {} catch {}, que faz com que seu aplicativo pare infelizmente ... e no corpo do catch, crie uma caixa de diálogo que navegará no tutorial pequeno do usuário para ativar a permissão de empate sobre outros aplicativos ... no botão sim, clique em colocar este código ...

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

essa intenção é abrir diretamente a lista de empate sobre outros aplicativos para gerenciar permissões e, a partir daqui, é um clique para empate sobre outros aplicativos Permissões ... eu sei que essa não é a resposta que você está procurando ... mas Estou fazendo isso nos meus aplicativos ...

Ashish
fonte