2016-09-13 3 views
2
int permissionCheck = ContextCompat.checkSelfPermission(mActivity, Manifest.permission.RECEIVE_SMS); 

ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.READ_CONTACTS}, 
      PERMISSION_REQUEST_CODE); 

Log.d(TAG, permissionCheck + ""); 

Проверка разрешения всегда возвращает PERMISSION_GRANTED, но в ОС (MiUi) приложение не имеет разрешений.Как просить разрешения в MiUi pre - Marshmallow?

Test Device: редми Примечание 3 Pro (MIUI 8)

+0

Итак, не используйте его. – Vyacheslav

+0

попробуйте это для проверки [разрешения] (http://stackoverflow.com/a/39263191/3960700) – Steve

+0

посмотрите на мой код – Vyacheslav

ответ

0

Для некоторых разрешений я использую такой подход:

private boolean permissionsActivated = (Build.VERSION.SDK_INT < Build.VERSION_CODES.M); 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
//.... 
     requirepermissionsifneeded(); 
//.... 
    } 

    @SuppressLint("NewApi") 
     private void requirepermissionsifneeded() { 
      // TODO Auto-generated method stub 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (!canAll()) { 
        permissionsActivated = false; 
        requestPermissions(INITIAL_PERMS, REQUESTPERM); 
       } 

else { 
permissionsActivated = true; 
} 
      } else { 
       permissionsActivated = true; 
      } 
     } 


@SuppressLint("NewApi") 
    private boolean hasPermission(String perm) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      return (PackageManager.PERMISSION_GRANTED == checkSelfPermission(perm)); 
     } else { 
      return true; 
     } 
     } 
private boolean canAll() { 
     // TODO Auto-generated method stub 
     return (canAccessLocation() && canCoarseLocation() && canGetAccounts()); 
    } 
    private boolean canAccessLocation() { 
     return hasPermission(android.Manifest.permission.ACCESS_FINE_LOCATION); 
    } 
    private boolean canCoarseLocation() { 
     return hasPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION); 
    } 
    private boolean canGetAccounts() { 
     return hasPermission(android.Manifest.permission.GET_ACCOUNTS); 
    } 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     // TODO Auto-generated method stub 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case REQUESTPERM: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        permissionsActivated = true; 
       } else { 
        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(this, ":(", Toast.LENGTH_LONG).show(); 
        permissionsActivated = false; 
       } 
      return; 
      } 
      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

где-то в коде

permissionsActivated = canAll();

-2

Для ниже API 23, мы обычно предполагаем, что наше приложение будет иметь все разрешения, объявленные в манифесте, и Xiaomi является одним из исключений.

Что вы можете сделать, это поместить ваш код в блок catch try и посмотреть, можете ли вы определить сценарий с помощью созданного исключения.

У меня нет такого устройства, поэтому я не могу это проверить. Я предполагаю, что это бросит SecurityException.

Для получения разрешения SMS, я не думаю, что вы можете это сделать. Вместо этого проинформируйте пользователя об установке, чтобы не отключать разрешения. Или вы можете попросить пользователя сделать это стандартным смс-приложением.

Попробуйте и сообщите нам об этом!

+0

Это не работает в устройствах MIUI –

+0

@PrinceChampappilly, что именно не работает? Вы проверили приложение MiUi permissions для включения доступа? –

+0

Он просит о программном вызове запроса разрешения RECIEVE_SMS или для автоматического предоставления его при установке для MIUI, ваш подход работает только на телефонах без MIUI. READ_CONTACTS в порядке, но RECIEVE_SMS и READ_SMS не могут быть запрограммированы с запросом, потому что большинство сообщений AUTO GENERATED помечены как SERVICE_SMS с помощью MIUI, и это разрешение не предоставляется APPS. Любое разрешение может быть предоставлено со страницы безопасности или страницы разрешения APP. –

0

в miui вам нужно спросить разрешения по-разному. Вам нужно проверить, что режим разрешения равен нулю или нет. проверка эта функция для разрешения чтения смс в выше зефира

private boolean checkUsagePermission() { 
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
    AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); 
    int mode = 0; 
    mode = appOps.checkOpNoThrow("android:read_sms", android.os.Process.myUid(), getPackageName()); 
    boolean granted = mode == AppOpsManager.MODE_ALLOWED; 
    if (!granted) { 
     //write your code for accept that permission 
     return false; 
    } 
} 
return true; 
} 

как только вы посмотрите на класс AppOpsManager в андроид студии.

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