Android                
            Runtime-behörigheter i API-23 +
        
        
            
    Sök…
Introduktion
Android Marshmallow introducerade Runtime Permission- modellen. Behörigheter kategoriseras i två kategorier, dvs. normala och farliga behörigheter . där farliga behörigheter nu beviljas av användaren vid körning.
Anmärkningar
Från sdk 23 Android kräver körtidstillstånd för behörigheter på enheter som kör Android 6.0 och högre, inom det som klassas som farliga tillåtelsesgrupper. Farliga tillåtelsesgrupper är de som anses äventyra användarens integritet och / eller säkerhet.
Följande är en lista över grupper med farliga tillstånd:
Farliga tillåtelsesgrupper
 Tillståndsgrupp 
 KALENDER 
 KAMERA 
 KONTAKTER 
 PLATS 
 MIKROFON 
 TELEFON 
 SENSORER 
 SMS 
 LAGRING 
Eventuella behörigheter från dessa grupper kräver hantering av runtime-behörigheter för enheter på Android 6.0 och högre med en mål-SDK på 23 eller högre.
Normala behörigheter
Följande är en lista över normala behörigheter. Dessa anses inte vara farliga för användarens integritet eller säkerhet och kräver inte körtidstillstånd för SDK 23 och högre.
 ACCESS_LOCATION_EXTRA_COMMANDS 
 ACCESS_NETWORK_STATE 
 ACCESS_NOTIFICATION_POLICY 
 ACCESS_WIFI_STATE 
 BLÅTAND 
 BLUETOOTH_ADMIN 
 BROADCAST_STICKY 
 CHANGE_NETWORK_STATE 
 CHANGE_WIFI_MULTICAST_STATE 
 CHANGE_WIFI_STATE 
 DISABLE_KEYGUARD 
 EXPAND_STATUS_BAR 
 GET_PACKAGE_SIZE 
 INSTALL_SHORTCUT 
 INTERNET 
 KILL_BACKGROUND_PROCESSES 
 MODIFY_AUDIO_SETTINGS 
 NFC 
 READ_SYNC_SETTINGS 
 READ_SYNC_STATS 
 RECEIVE_BOOT_COMPLETED 
 REORDER_TASKS 
 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 
 REQUEST_INSTALL_PACKAGES 
 SÄTT ALARM 
 SET_TIME_ZONE 
 ANGE BAKGRUND 
 SET_WALLPAPER_HINTS 
 TRANSMIT_IR 
 UNINSTALL_SHORTCUT 
 USE_FINGERPRINT 
 VIBRERA 
 WAKE_LOCK 
 WRITE_SYNC_SETTINGS 
Android 6.0 flera behörigheter
Detta exempel visar hur du kontrollerar behörigheter vid körning i Android 6 och senare.
public static final int MULTIPLE_PERMISSIONS = 10; // code you want.
String[] permissions = new String[] {
    Manifest.permission.WRITE_EXTERNAL_STORAGE,
    Manifest.permission.CAMERA,
    Manifest.permission.ACCESS_COARSE_LOCATION,
    Manifest.permission.ACCESS_FINE_LOCATION
};
@Override
void onStart() {
    if (checkPermissions()){
        // permissions granted.    
    } else {
        // show dialog informing them that we lack certain permissions
    }
}
private boolean checkPermissions() {
    int result;
    List<String> listPermissionsNeeded = new ArrayList<>();
    for (String p:permissions) {
        result = ContextCompat.checkSelfPermission(getActivity(),p);
        if (result != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), MULTIPLE_PERMISSIONS);
        return false;
    }
    return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MULTIPLE_PERMISSIONS:{
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                // permissions granted.
            } else {
                // no permissions granted.
            }
            return;
        }
    }
}
        Verkställer behörigheter i sändningar, URI
Du kan göra en behörighetskontroll när du skickar en avsikt till en registrerad sändningsmottagare. Behörigheterna du skickar krysskontrolleras med de som är registrerade under taggen. De begränsar vem som kan skicka sändningar till den tillhörande mottagaren.
 Om du vill skicka en sändningsbegäran med behörigheter anger du tillståndet som en sträng i Context.sendBroadcast(Intent intent, String permission) , men kom ihåg att mottagarens app MÅSTE ha den behörigheten för att få din sändning. Mottagaren ska installeras först före avsändaren. 
Metodsignaturen är:
 void sendBroadcast (Intent intent, String receiverPermission)
 //for example to send a broadcast to Bcastreceiver receiver
 Intent broadcast = new Intent(this, Bcastreceiver.class);
 sendBroadcast(broadcast, "org.quadcore.mypermission");
 och du kan ange i ditt manifest att sändarens avsändare måste inkludera den begärda behörigheten som skickats via sendBroadcast:
 <!--  Your special permission -->
 <permission android:name="org.quadcore.mypermission" 
    android:label="my_permission" 
    android:protectionLevel="dangerous"></permission>
 Förklara också tillståndet i manifestet för den applikation som är tänkt att ta emot denna sändning:
 <!--  I use the permission ! -->
 <uses-permission android:name="org.quadcore.mypermission"/>
 <!-- along with the receiver -->
 <receiver android:name="Bcastreceiver" android:exported="true" />
 Obs: Både en mottagare och en programföretag kan kräva tillstånd, och när detta händer måste båda behörighetskontrollerna passera för att avsikten ska levereras till det tillhörande målet. Appen som definierar behörigheten bör installeras först.
Hitta den fullständiga dokumentationen här om Behörigheter.
Flera körtidstillstånd från samma tillåtelsesgrupper
I manifestet har vi fyra farliga körtidstillstånd från två grupper.
<!-- Required to read and write to shredPref file. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- Required to get location of device. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 I den aktivitet där behörigheterna krävs. Observera att det är viktigt att kontrollera för behörigheter i alla aktiviteter som kräver behörigheter, eftersom behörigheterna kan återkallas medan appen är i bakgrunden och appen kraschar sedan.
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act_layout);
    
    // A simple check of whether runtime permissions need to be managed 
    if (Build.VERSION.SDK_INT >= 23) {
        checkMultiplePermissions();
    }
 Vi behöver bara be om tillstånd för en av dessa från varje grupp och alla andra behörigheter från denna grupp beviljas om inte tillståndet återkallas av användaren.
private void checkMultiplePermissions() {
    if (Build.VERSION.SDK_INT >= 23) {
        List<String> permissionsNeeded = new ArrayList<String>();
        List<String> permissionsList = new ArrayList<String>();
        
        if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_FINE_LOCATION)) {
            permissionsNeeded.add("GPS");
        }
        if (!addPermission(permissionsList, android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
            permissionsNeeded.add("Read Storage");
        }
        
        if (permissionsList.size() > 0) {
            requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            return;
        }
    }
}
private boolean addPermission(List<String> permissionsList, String permission) {
    if (Build.VERSION.SDK_INT >= 23)
        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
            // Check for Rationale Option
            if (!shouldShowRequestPermissionRationale(permission))
                return false;
        }
    return true;
}
 Detta handlar om resultatet av att användaren tillåter eller inte tillåter behörigheter. I det här exemplet, om behörigheterna inte är tillåtna, dödas appen.
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
        
            Map<String, Integer> perms = new HashMap<String, Integer>();
            // Initial
            perms.put(android.Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
            perms.put(android.Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
            
            // Fill with results
            for (int i = 0; i < permissions.length; i++)
                perms.put(permissions[i], grantResults[i]);
            if (perms.get(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    && perms.get(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                // All Permissions Granted
                return;
            } else {
                // Permission Denied
                if (Build.VERSION.SDK_INT >= 23) {
                    Toast.makeText(
                            getApplicationContext(),
                            "My App cannot run without Location and Storage " +
                                    "Permissions.\nRelaunch My App or allow permissions" +
                                    " in Applications Settings",
                            Toast.LENGTH_LONG).show();
                    finish();
                }
            }
        }
        break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
 Mer information https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en
Med PermissionUtil
 PermissionUtil är ett enkelt och bekvämt sätt att be om behörigheter i sammanhang. Du kan enkelt ange vad som ska hända om alla begärda behörigheter har beviljats ( onAllGranted() ), varje begäran avslogs ( onAnyDenied() ) eller om det krävs en rationell ( onRational() ). 
Överallt i din AppCompatActivity eller Fragment som du vill be om användarens tillstånd
mRequestObject = PermissionUtil.with(this).request(Manifest.permission.WRITE_EXTERNAL_STORAGE).onAllGranted(
                new Func() {
                    @Override protected void call() {
                        //Happy Path
                    }
                }).onAnyDenied(
                new Func() {
                    @Override protected void call() {
                        //Sad Path
                    }
                }).ask(REQUEST_CODE_STORAGE);
  Och lägg till detta till onRequestPermissionsResult 
if(mRequestObject!=null){
    mRequestObject.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
 Lägg till den begärda behörigheten till din AndroidManifest.xml också
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        Inkludera all tillståndsrelaterad kod till en abstrakt basklass och utöka aktiviteten för denna basklass för att uppnå renare / återanvändbar kod
public abstract class BaseActivity extends AppCompatActivity {
    private Map<Integer, PermissionCallback> permissionCallbackMap = new HashMap<>();
    @Override
    protected void onStart() {
        super.onStart();
        ...
    }
    @Override
    public void setContentView(int layoutResId) {
        super.setContentView(layoutResId);
        bindViews();
    }
    ...
    @Override
    public void onRequestPermissionsResult(
            int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        PermissionCallback callback = permissionCallbackMap.get(requestCode);
        if (callback == null) return;
        // Check whether the permission request was rejected.
        if (grantResults.length < 0 && permissions.length > 0) {
            callback.onPermissionDenied(permissions);
            return;
        }
        List<String> grantedPermissions = new ArrayList<>();
        List<String> blockedPermissions = new ArrayList<>();
        List<String> deniedPermissions = new ArrayList<>();
        int index = 0;
        for (String permission : permissions) {
            List<String> permissionList = grantResults[index] == PackageManager.PERMISSION_GRANTED
                    ? grantedPermissions
                    : ! ActivityCompat.shouldShowRequestPermissionRationale(this, permission)
                        ? blockedPermissions
                        : deniedPermissions;
            permissionList.add(permission);
            index ++;
        }
        if (grantedPermissions.size() > 0) {
            callback.onPermissionGranted(
                    grantedPermissions.toArray(new String[grantedPermissions.size()]));
        }
        if (deniedPermissions.size() > 0) {
            callback.onPermissionDenied(
                    deniedPermissions.toArray(new String[deniedPermissions.size()]));
        }
        if (blockedPermissions.size() > 0) {
            callback.onPermissionBlocked(
                    blockedPermissions.toArray(new String[blockedPermissions.size()]));
        }
        permissionCallbackMap.remove(requestCode);
    }
    /**
     * Check whether a permission is granted or not.
     *
     * @param permission
     * @return
     */
    public boolean hasPermission(String permission) {
        return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
    }
    /**
     * Request permissions and get the result on callback.
     *
     * @param permissions
     * @param callback
     */
    public void requestPermission(String [] permissions, @NonNull PermissionCallback callback) {
        int requestCode = permissionCallbackMap.size() + 1;
        permissionCallbackMap.put(requestCode, callback);
        ActivityCompat.requestPermissions(this, permissions, requestCode);
    }
    /**
     * Request permission and get the result on callback.
     *
     * @param permission
     * @param callback
     */
    public void requestPermission(String permission, @NonNull PermissionCallback callback) {
        int requestCode = permissionCallbackMap.size() + 1;
        permissionCallbackMap.put(requestCode, callback);
        ActivityCompat.requestPermissions(this, new String[] { permission }, requestCode);
    }
}
 Exempel på användning i aktiviteten
Aktiviteten bör utvidga den abstrakta basklassen som definierats ovan enligt följande:
private void requestLocationAfterPermissionCheck() {
    if (hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)) {
        requestLocation();
        return;
    }
    // Call the base class method.
    requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, new PermissionCallback() {
        @Override
        public void onPermissionGranted(String[] grantedPermissions) {
            requestLocation();
        }
        @Override
        public void onPermissionDenied(String[] deniedPermissions) {
            // Do something.
        }
        @Override
        public void onPermissionBlocked(String[] blockedPermissions) {
            // Do something.
        }
    });
}