2015-06-29 7 views
26

Что касается разрешений гранулированных на Android M.Открыть приложение настройки разрешений

В случае, если пользователь отрицает дважды просьбу о разрешении,

Или что пользователь маркировать «Никогда не спрашивать».

Как я могу открыть/связать напрямую с настройками разрешений приложения?

+12

Там, кажется, не быть 'действие Intent' в' Settings' для этого, даже в документации МНК. 'ACTION_APPLICATION_DETAILS_SETTINGS', вероятно, самый близкий. – CommonsWare

ответ

19

Давайте предположим, что в AndroidManifest.xml у вас есть:

<uses-permission android:name="android.permission.WRITE_CALENDAR"/> 
<uses-permission android:name="android.permission.WRITE_CONTACTS"/> 
<!-- ETC. --> 

Тогда, как в приведенном ниже примере деятельности, мы можем проверить на существующих/выданных разрешений, а затем отправить пользователю настройках приложения, если мы пропускаем любое разрешение:

package com.example.permissions.myapplication; 

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.Settings; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    private static final int REQUEST_APP_SETTINGS = 168; 

    private static final String[] requiredPermissions = new String[]{ 
      Manifest.permission.WRITE_CALENDAR, 
      Manifest.permission.WRITE_CONTACTS 
      /* ETC.. */ 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     /* All version with SDK_INT < 22 grant permissions on install time. */ 
     if (Build.VERSION.SDK_INT > 22 && !hasPermissions(requiredPermissions)) { 
      Toast.makeText(this, "Please grant all permissions", Toast.LENGTH_LONG).show(); 
      goToSettings(); 
     } 
    } 

    private void goToSettings() { 
     Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName())); 
     myAppSettings.addCategory(Intent.CATEGORY_DEFAULT); 
     myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivityForResult(myAppSettings, REQUEST_APP_SETTINGS); 
    } 

    public boolean hasPermissions(@NonNull String... permissions) { 
     for (String permission : permissions) 
      if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permission)) 
       return false; 
     return true; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_APP_SETTINGS) { 
      if (hasPermissions(requiredPermissions)) { 
       Toast.makeText(this, "All permissions granted!", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Permissions not granted.", Toast.LENGTH_LONG).show(); 
      } 
     } 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

Я просто попробовал это на Nexus 6/AndroidOS 6 (Marshmallow).

+2

Просто быстрое добавление. Это не работает для сторонних решений для разрешения приложений, например, используется в oneplus 2 oxygen os. Настройки управляются из пользовательских настроек в кислородных ок. – Corne

+0

Спасибо, это сработало для меня – John

+0

@Corne Это значит, что приложение падает, или ничего не происходит? – rpattabi

3

использовать этот код для запуска вашей странице настройки разрешения приложение

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, 
      Uri.parse("package:" + getPackageName())); 
    intent.addCategory(Intent.CATEGORY_DEFAULT); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 
Смежные вопросы