2016-10-27 4 views
0

Я правильно разрешаю и отказываюсь от разрешения, и приложение работает правильно в первый раз, но когда все разрешения предоставлены, а в следующий раз, когда пользователь запускает приложение, он показывает только заставку экрана и становитесь стабильными и не переходите к следующей активности, и это также не дает никакой ошибки, что я пытаюсь сделать ниже.Приложение не переходит к следующему действию, пока предоставляется все разрешения

private static final int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 5; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_splash); 
    splashIcon = (ImageView) findViewById(R.id.splashIcon); 
    new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      Animation anim1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.bounce); 
      splashIcon.setAnimation(anim1); 
      anim1.setAnimationListener(new Animation.AnimationListener() { 
       @Override 
       public void onAnimationStart(Animation animation) {} 
       @Override 
       public void onAnimationEnd(Animation animation) { 
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
        { 
         checkMultiplePermissions(); 
        }else{ 
         startActivity(new Intent(Splash.this,UserGuideActivity.class)); 
         finish(); 
        } 
       } 
       @Override 
       public void onAnimationRepeat(Animation animation) 
       { 
       } 
      }); 
     } 
    }).start(); 
} 
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(!addPermission(permissionsList, Manifest.permission.READ_SMS)) 
     { 
      permissionsNeeded.add("Read Sms"); 
     } 
     if(!addPermission(permissionsList, Manifest.permission.READ_CONTACTS)) 
     { 
      permissionsNeeded.add("Read Contacts"); 
     } 
     if(!addPermission(permissionsList, Manifest.permission.READ_CALL_LOG)) 
     { 
      permissionsNeeded.add("Read Calllogs"); 
     } 

     if (permissionsList.size() > 0) 
     { 
      requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
     } 
    } 
} 



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; 
} 
@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); 
      perms.put(Manifest.permission.READ_SMS,PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.READ_CONTACTS,PackageManager.PERMISSION_GRANTED); 
      perms.put(Manifest.permission.READ_CALL_LOG,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 
        && perms.get(Manifest.permission.READ_SMS)==PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.READ_CONTACTS)==PackageManager.PERMISSION_GRANTED 
        && perms.get(Manifest.permission.READ_CALL_LOG)==PackageManager.PERMISSION_GRANTED) 
      { 
       // All Permissions Granted 
       startActivity(new Intent(this,UserGuideActivity.class)); 
       finish(); 
       return; 
      } else { 
       // Permission Denied 
       if (Build.VERSION.SDK_INT >= 23) { 
        Toast.makeText(getApplicationContext(), "Please permit all the permissions", Toast.LENGTH_LONG).show(); 
        finish(); 
       } 
      } 
     } 
     break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 
+0

Вы просто проверяете, разрешено ли все разрешения или нет: if (grantResults.length == permissions.length) –

ответ

4

, потому что, если все разрешения предоставляются, то это будет false и нет else случая, чтобы сделать что-нибудь

if (permissionsList.size() > 0) 
    { 
     requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
       REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
    } 

так должно быть, как это

if (permissionsList.size() > 0) 
    { 
     requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
       REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
    } 
    else{ 
      startActivity(new Intent(Splash.this,UserGuideActivity.class)); 
         finish(); 
    } 

Улучшения: вы может исключить создание карты и петли путем повторного использования функции checkMultiplePermissions, но в других местах потребуется модификация

0

Как вы описали в своем вопросе, что он работает в первый раз, и вы даете все разрешения. Таким образом, согласно вашему коду , если предоставлены все разрешения, он будет не переходить наonRequestPermissionsResult. И вы написали свою часть Intent в этом методе, чтобы она оставалась на одном экране. Добавить еще заявление, как заявил Pavneet

1

Проверьте это условие:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
{ 
    checkMultiplePermissions(); 
}else{ 
    startActivity(new Intent(Splash.this,UserGuideActivity.class)); 
    finish(); 
} 

Ничего не случится после того, как checkMultiplePermissions() выполняется, так что вам нужно добавить startActivity есть только тогда, когда разрешения предоставляются.

Надеюсь, это поможет!

0

Попытка создать метод, чтобы проверить это все разрешение выдается или нет, если не предоставлено, то он будет автоматически попросить каждого разрешения дополнительный проход isAllPermissionRequired флаг использовать тот же метод на onRequestPermissionsResult если вы не требовали, чтобы все разрешения будут сдвинуты другой экран

private static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 121; 

private boolean checkAndRequestPermissions(boolean isAllPermissionRequired) { 
     int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
     int readStoragePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); 
     int readSmsPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS); 
     int readContactPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS); 
     int readCallLogPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG); 

     List<String> listPermissionsNeeded = new ArrayList<>(); 
     if (locationPermission != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION); 
     } 
     if (readStoragePermission != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE); 
     } 

     if (readSmsPermission != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(Manifest.permission.READ_SMS); 
     } 

     if (readContactPermission != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(Manifest.permission.READ_CONTACTS); 
     } 

     if (readCallLogPermission != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(Manifest.permission.READ_CALL_LOG); 
     } 

     if (!listPermissionsNeeded.isEmpty()) { 
      if(isAllPermissionRequired) { 
       ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); 
       return false; 
      }else { 
       return true; 
      } 
     } 
     return true; 
    } 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    if (requestCode == REQUEST_ID_MULTIPLE_PERMISSIONS) { 
     if (checkAndRequestPermissions(false)) { 
      startActivity(new Intent(Splash.this,UserGuideActivity.class)); 
      finish(); 
     } 
    } 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(checkAndRequestPermissions(true)){ 
     startActivity(new Intent(Splash.this,UserGuideActivity.class)); 
     finish(); 
    } 
} 

Примечание: Приведенный выше пример я имею передать isAllPermissionRequired = true от onCreate попросить каждого разрешения и isAllPermissionRequired = false от onRequestPermissionsResult не просить никакого разрешения даже пользователь не предоставлять, но вам нужно пройти isAllPermissionRequired = true в onRequestPermissionsResult при необходимости все разрешения обязательно.

Смежные вопросы