2016-06-26 4 views
1

У меня есть очень большая проблема (Почему приложение не видит разрешения Camera2API?

Я работаю с Camera2API и и я использую для него стандартного примера Google.

Mystic, когда я использую этот метод

private void openCamera(int width, int height) { 
    setUpCameraOutputs(width, height); 

    configureTransform(width, height); 
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try { 
     if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { 
      throw new RuntimeException("Time out waiting to lock camera opening."); 

     } 

     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != 
       PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 

     manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); 


    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     throw new RuntimeException("Interrupted while trying to lock camera opening.", e); 
    } 
} 

Я использую Samsung S6 android 6.0

Я ожидаю, что метод manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); - открывает камеру, но вместо этого кода останавливая в

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != 
       PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 

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

<uses-permission android:name="android.permission.CAMERA" /> 

Что это значит?

У меня есть это разрешение, почему оно не проходит проверку?

Я пытался запускать это приложение на Meizu MX5 android 5.1 и он открывает камеру и все в порядке ...

Может быть, проблема в androind версии?

Что я делаю неправильно? Как я могу проверить это?

+0

Если вы являетесь целевым Api - 23, у вас есть проверка разрешения времени выполнения. Посмотрите этот пример https://github.com/googlesamples/android-RuntimePermissions –

ответ

1

Вы сказали, что используете Android 6.0 правильно?
Согласно this, даже если вы объявляете разрешения в манифесте, вы должны индивидуально проверять каждое разрешение, запрашивать каждое разрешение, если оно не было предоставлено.
Чтобы сделать это, после того, как:

if (ActivityCompat.checkSelfPermission(this,Manifest.permission.CAMERA) != 
     PackageManager.PERMISSION_GRANTED) { 
     return; 
} 

Вместо return, сделать это,

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA},YOUR_INTEGER_CONSTANT_FOR_THE_CALLBACK); 

и реализовать функцию обратного вызова, как описано в связанной странице

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case YOUR_INTEGER_CONSTANT_FOR_THE_CALLBACK: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Log.d(TAG,"Granted"); 
       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 
       Log.d(TAG,"Denied"); 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

Надежда, что помогает.

0

В своем Samsung перейдите к своему: Настройки -> Приложения -> «Ваше приложение» -> Разрешения; и вручную установите разрешения. Это происходит, когда ваш целевой API равен 23 и выше. Он будет работать нормально в более низких версиях. Если вы хотите, чтобы ваше приложение получало разрешения автоматически на Android версии 6.0 и выше, в вашем gradle измените целевой API на 22. Также было бы лучше реализовать в своем приложении запрос о разрешениях.

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