Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Почему приложение не видит permission (Android 6.0 Marshmallow)?

#java #android #camera #android_camera


Я работаю с Camera2API и использую для этого гугловский пример который на гите

Мистика вот в этом методе который и открывает камеру

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;
        }


насколько я понимаю, он не проходит проверку на permission, я проверил в манифесте
это и там есть нужный permission




Что это может означать?

Потом я попробовал открыть камеру на Meizu MX5 android 5.1 и все открывается и правильно
работает

Может ли проблема быть в версиях андроида?

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


Ответы

Ответ 1



В android 6.0 изменились правила запроса разрешений теперь нужно запрашивать разрешения, а не просто прописать в manifest. Ссылка на документацию от google

Ответ 2



В итоге вот так все заработало, почитал офф статью и там действительно много изменений для 6-ки (кстати мне понравилось как все описано здесь), ну в общем согласно все нововедений собралось вот такое решение С формой реализации диалога запроса если ранее в пермишене было отказано public void camera(View view) { toCamera(); } private void toCamera() { if (!isCheckPermission()){ return; } if (isProcessWasFinish()) { startActivity(new Intent(getApplicationContext(), CameraActivity.class)); overridePendingTransition(R.anim.open_next, R.anim.close_main); } else { startActivity(new Intent(getApplicationContext(), UserDataScreen.class)); overridePendingTransition(R.anim.open_next, R.anim.close_main); } } private boolean isCheckPermission() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { showMessageOKCancel("You need to allow access to Camera"); return false; } // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST); return false; // MY_PERMISSIONS_REQUEST is an // app-defined int constant. The callback method gets the // result of the request. } return true; } private void showMessageOKCancel(String message) { new AlertDialog.Builder(MainActivity.this) .setMessage(message) .setPositiveButton("OK", listener) .setNegativeButton("Cancel", listener) .create() .show(); } DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { final int BUTTON_NEGATIVE = -2; final int BUTTON_POSITIVE = -1; @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case BUTTON_NEGATIVE: // int which = -2 dialog.dismiss(); break; case BUTTON_POSITIVE: // int which = -1 ActivityCompat.requestPermissions( MainActivity.this, new String[]{android.Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST); dialog.dismiss(); break; } } }; @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.e(MY_LOG, "Camera permission Granted"); // permission was granted, yay! Do the // contacts-related task you need to do. toCamera(); } else { Log.e(MY_LOG, "Camera permission Denied"); // permission denied, boo! Disable the // functionality that depends on this permission. } } default: { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } // other 'case' lines to check for other // permissions this app might request } }

Ответ 3



То, что вы разобрались, это очень хорошо. Но руками каждый раз проверять и запрашивать permission очень неудобно. Используйте готовые решения https://github.com/Karumi/Dexter

Ответ 4



http://easyrobot.online/temp/permission6.jar if(!AccessPermission.getPermmission(this)){ AccessPermission.setOnPermmissionResult(new OnPermmissionResult() { @Override public void OnPermmission(boolean access, String[] permissions, int[] grantResults) { if(access)init(); } }); }else init(); - в манифест

Комментариев нет:

Отправить комментарий