2016-04-07 31 views
5

Sto gestendo il mio codice applicazione per funzionare in Marshmallow dispositivi, sto gestendo la sua finestra di dialogo permessi per mostrare nei posti necessari.In Marshmallow, come richiamare due o più finestre di autorizzazione una per una come fa Hangouts?

Attualmente ostacolato da questo scenario in cui sono richiesti due permessi (Ubicazione e archiviazione) e voglio chiedere uno alla volta come fa Hangout. Non hai trovato il modo in cui è personalizzato, nessuna soluzione?

enter image description here enter image description here

ecco il codice mi occupo per la singola autorizzazione:

case REQUEST_CODE_WRITE_EXTERNAL_STORAGE: { 

    if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 
     /Permission is granted 
     Toast.makeText(this, "SDK >= 23 & permission Granted ", Toast.LENGTH_SHORT).show(); 
     return true; 

    } else { 
     //Permission is revoked 
     ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE); 
     return false; 
    } 
} 

E in onRequestPermissionsResult():

case REQUEST_CODE_WRITE_EXTERNAL_STORAGE: { 

    // If request is cancelled, the result arrays are empty. 
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

     // permission was granted, yay! Do the 
     // contacts-related task you need to do. 
     Log.e("PMS", "granted"); 
     Toast.makeText(this, "SDK >= 23 & permission Granted ", Toast.LENGTH_SHORT).show(); 

    } else { 
     Log.e("PMS", "Not Granted"); 

     // permission denied, boo! Disable the 
     // functionality that depends on this permission. 
     int checkStatus = getPermissionStatus(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (checkStatus == 3) { 
      Toast.makeText(this, "SDK >= 23 & permission Denied ", Toast.LENGTH_SHORT).show(); 

     } else if (checkStatus == 4) { 
      Toast.makeText(this, "SDK >= 23 & permission Blocked ", Toast.LENGTH_SHORT).show(); 

     } 
    } 
    return; 
} 

risposta

2

Per richiedere l'autorizzazione multipla uno per uno è necessario aggiungere tutti i permessi nel secondo parametro String[]ActivityCompat.requestPermissions metodo. Come questo:

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE); 

farmi sapere se aiuta

+0

Grazie per il vostro tempo. @Sagar Trehan – SaravanaRaja

1

Controllare questo post https://stackoverflow.com/a/35495855/403255 per la risposta dettagliata. Ho aggiunto WRITE_EXTERNAL_STORAGE alla risposta di @nicks.

public static final int REQUEST_MULTIPLE_PERMISSIONS_ID = 456; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if(checkAndRequestPermissions()) { 
     // TODO - all permissions granted already 
    } 
} 

private boolean checkAndRequestPermissions() { 
    int permissionSendMessage = ContextCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    List<String> listPermissionsNeeded = new ArrayList<>(); 
    if (locationPermission != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION); 
    } 
    if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    } 
    if (!listPermissionsNeeded.isEmpty()) { 
     ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_MULTIPLE_PERMISSIONS_ID); 
     return false; 
    } 
    return true; 
} 
+0

Grazie per il collegamento lo verificherà – SaravanaRaja

0

Io uso un permesso util per questo:

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.util.Log; 



/** 
* Permission Utils 
*/ 
public final class PermissionUtils { 

    public static final String PER_READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE; 
    public static final String PER_GET_ACCOUNTS = Manifest.permission.GET_ACCOUNTS; 
    public static final String PER_WAKE_LOCK = Manifest.permission.WAKE_LOCK; 
    public static final String FEEDBACK_PERMISSION_REQUEST_CODE = 1001; 


    private PermissionUtils() { 
    } 

    public static boolean checkPermissions(Context context, String... permissions) { 
     for (String permission : permissions) { 
      if (!checkPermission(context, permission)) { 
       return false; 
      } 
     } 
     return true; 
    } 

    public static boolean AllPermissionsGranted(Context context) { 
     return IsAccountsInfoGranted(context) && IsDeviceInfoGranted(context); 
    } 

    public static boolean checkPermission(Context context, String permission) { 
     return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED; 
    } 

    //define functions for each permission 
    public static boolean IsWakeLockGranted(Context context) { 
     return checkPermission(context, PER_WAKE_LOCK); 
    } 

    public static boolean IsAccountsInfoGranted(Context context) { 
     return checkPermission(context, PER_GET_ACCOUNTS); 
    } 

    public static boolean IsDeviceInfoGranted(Context context) { 
     return checkPermission(context, PER_READ_PHONE_STATE); 
    } 

    public static boolean PermissionsGranted(@NonNull int[] permissionResults) { 
     if (permissionResults.length > 0) { 
      for (int permission : permissionResults) { 
       if (permission != PackageManager.PERMISSION_GRANTED) 
        return false; 
      } 
      return true; 
     } else return false; 
    } 

    public static void RequestPermissions(Activity activity, int permissionId, String... permissions) { 
     ActivityCompat.requestPermissions(activity, permissions, permissionId); 
    } 
} 

Usa questo codice per richiedere le autorizzazioni a dove si vuole:

String[] permissions = new String[]{PermissionUtils.PER_GET_ACCOUNTS, PermissionUtils.PER_READ_PHONE_STATE}; 
PermissionUtils.RequestPermissions(Act_Launch.this, PermissionUtils.FEEDBACK_PERMISSION_REQUEST_CODE, permissions); 

E questo metodo in attività per gestire l'autorizzazione o il rifiuto dell'app

/*************************************** 
    * RequestPermissionResult 
    ***************************************/ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case PermissionUtils.PERMISSION_REQUEST_CODE: 
       if (PermissionUtils.PermissionsGranted(grantResults)) { 
        ShowRegistrationView(); 
       } else { 
        //Do Whatever you want 
       } 
       break; 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
0

È necessario inviare più autorizzazioni contemporaneamente in un array. Si consiglia di utilizzare le librerie PermissionHelper o PermissionsDispatcher. allora si può solo richiedere in questo modo:

permissionHelper 
    .setForceAccepting(false)// true if you had like force reshowing the permission dialog on Deny (not recommended) 
    .request(MULTIPLE_PERMISSIONS_ARRAY); 

Spero che aiuta!