2

Итак, все эти новые разрешения на управление андроидами меня запутали. Мое приложение в настоящее время компилирует и настраивает версию 23, что означает, что я должен использовать разрешения во время выполнения. Мое приложение в основном использует API камеры, которая требует разрешения камеры, поэтому я добавил разрешения во время выполнения перед открытием камеры как таковой:путают о разрешениях на выполнение андроидов

 if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.CAMERA) 
       != PackageManager.PERMISSION_GRANTED) 
     {//ask permissions for camera 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.CAMERA}, 
        CameraPermissions); 
     } 
     else 
     {//permissions attained now you can open the camera 
      camera=Camera.open(getCid()); 
      camera.setPreviewCallback(this); 
      initPreview(width, height); 
      startPreview(); 
      startTimer(); 
     } 

Я также проверить, когда я останавливаю камеру:

 if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.CAMERA) 
       == PackageManager.PERMISSION_GRANTED) { 
      camera.setPreviewCallback(null); 
      camera.release(); 
      faceProc.release(); 
      faceProc = null; 
      camera = null; 
      inPreview = false; 
      cameraConfigured = false; 
     } 

разрешения запрос обрабатывается как таковой:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case CameraPermissions: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       StartUpCam(); 
      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setMessage("How is this app going to work if you rejected the camera permission.... DUHHHH!!") 
         .setTitle("Rejected"); 
       builder.setPositiveButton("Exit App", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         //close application 
         closeApp(); 
        } 
       }); 
       AlertDialog dialog = builder.create(); 
       dialog.show(); 
      } 
      return; 
     } 
    } 
} 

Таким образом, когда запрос дается это вызывает StartUpCam, который затем пытается открыть камеру, если разрешения дается. Итак, вот мои вопросы, если я добавлю это разрешение на проверку времени выполнения, как это влияет на устройства Android ниже 6.0? Таким образом, телефон с версией 5.0.1 также получит приглашение предоставить разрешения камеры? Если я использую разрешения во время выполнения, мне нужно удалить разрешения камеры в файле манифеста? В настоящее время я сохраняю разрешения камеры в манифесте вместе с разрешениями времени выполнения, которые я не знаю, если это правильно или нет. Что делать, если я опустил цель и скомпилировал sdk на 22 вместо 23, будут ли Android-устройства выше 6.0 не смогут загружать мое приложение ??? Если я опускаю его до версии 22, то я избегаю все это головная боль ...

+0

Вы можете проверить класс, который я создал, и использовать его в Fragments. Github.com/mptrista/PermissionHelper. Это фрагменты и в случае запроса единого разрешения. – toshkinl

ответ

1

Я также проверить, когда я останавливаю камеру

Это не требуется, при условии, что вы не пытаетесь остановить камеры, которую вы никогда не открывали. Если пользователь отменяет разрешение во время работы вашего приложения, ваш процесс немедленно прекращается. В результате вы никогда не сможете потерять разрешения в запущенном приложении. Поскольку вы проверили и получили разрешение на открытие камеры, у вас уже есть разрешение на ее закрытие.

, если я добавлю это разрешение на выполнение, проверяет, как это влияет на устройства Android ниже 6.0?

ContextCompat.checkSelfPermission() вернется PackageManager.PERMISSION_GRANTED на старых устройствах, при условии, что у вас есть разрешение, указанный в манифесте.

Таким образом, телефон с версией 5.0.1 также получит приглашение предоставить разрешения камеры?

No.

Если я использую разрешение во время выполнения, я должен удалить разрешение камеры в файле манифест?

No. Эти элементы необходимы на всех Android-версиях.

Что делать, если я опустил цель и скомпилировал sdk на 22 вместо 23, будут ли устройства Android выше 6.0 не смогут загружать мое приложение?

Ваш compileSdkVersion не влияет на какие версии Android вы поддерживаете. Пользователи Android 6.0 все равно смогут загрузить ваше приложение.

Если вы снижаете targetSdkVersion до 22 или ниже, это также не влияет на какие версии Android, которые вы поддерживаете. Пользователи Android 6.0 все равно смогут загрузить ваше приложение. Это означает, что вы можете пропустить код разрешения времени выполнения. Однако имейте в виду, что у вас все еще нет разрешения. Пользователи устройств Android 6.0, запуская ваше приложение targetSdkVersion 22, предоставят разрешение CAMERA по умолчанию. Но эти пользователи все равно могут войти в «Настройки»> «Приложения», найти ваше приложение и отменить это разрешение. С API-интерфейсом камеры вы в принципе не можете открыть камеру.

Тактически, переход от targetSdkVersion из 22 или ниже, безусловно, возможен. В конце концов, однако, что-то собирается «заставить вашу руку» и требует от вас перейти на targetSdkVersion 23 или выше. Итак, когда-нибудь вам придется иметь дело с разрешениями времени выполнения. Будь то сегодня или когда-нибудь в будущем, вы решаете.

+0

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

0

Нет, если разрешение указано в файле манифеста. Android, имеющий менее 23 sdk, не получит приглашение о разрешении, оно будет таким же, как раньше.