Разрешение камеры не работает на устройствах Marshmallow и выше и вылетает

Так как я сделал приложение для фонарика и оно корректно работает на устройствах с SDK 22 и ниже. Но когда я прихожу проверить на устройствах зефир и выше, он не запускается и падает в начале, только я запросил разрешение, используя следующий код, но, похоже, он вообще не работает. вот мой код для запроса разрешения камеры во время выполнения. вот мой код:

if( ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{android.Manifest.permission.CAMERA},
                    5);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[]  permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 5) {
            if  (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Now user should be able to use camera
            }
            else {
                // Your app will not have this permission. Turn off all functions
                // if permission not granted it will force close the app

            }
        }

Я пробовал устройства с зефиром и нугой, но он не запрашивает разрешение камеры, и мне приходится проходить его вручную с setting-app-flashlight-permission-allow. Кто-нибудь может мне помочь. В настоящее время я тестирую свое приложение в Lineage os 7.1.1


person Arjun Thakuri    schedule 17.04.2017    source источник
comment
попробуйте удалить->установить и посмотреть, запрашивает ли это разрешение. Может случиться так, что вы по ошибке установили этот флажок never ask again.   -  person Abhishek Bansal    schedule 17.04.2017
comment
Нет, он вообще не спрашивает разрешения, он просто вылетает. но приложение работает нормально, если я разрешаю разрешение вручную, как я сказал выше, из settings-app-permission-allow.   -  person Arjun Thakuri    schedule 17.04.2017


Ответы (5)


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

<uses-permission-sdk-23 android:name="android.permission.CAMERA"/>
person Morya    schedule 07.04.2018
comment
Спасибо что подметил это! Дополнительную информацию можно найти здесь - person Alfeu; 07.11.2018

Просто вы меняетесь только в том случае, если ваш код идеален, как это,

if( ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(new String[]{android.Manifest.permission.CAMERA},
                5);


    }

}

to

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
     if( ContextCompat.checkSelfPermission(this, 
             android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{android.Manifest.permission.CAMERA},
                5);


        }

    }
person Pravin Suthar    schedule 17.04.2017

Используйте приведенный ниже код и вызовите метод requestPermission в onCreate действия:

private static final int REQUEST_CODE_PERMISSION = 2;
    List<String> mPermission=new ArrayList<String>();

public void requestPermission()
            {
                try {

                    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                            != MockPackageManager.PERMISSION_GRANTED)
                        mPermission.add(Manifest.permission.CAMERA);

                    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                            != MockPackageManager.PERMISSION_GRANTED


                            )
                        mPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE

                        );

                    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                            != MockPackageManager.PERMISSION_GRANTED)
                        mPermission.add(Manifest.permission.READ_EXTERNAL_STORAGE);




                    if(mPermission.size()>0)

                    {
                        String[] array = mPermission.toArray(new String[mPermission.size()]);
                        ActivityCompat.requestPermissions(this, array, REQUEST_CODE_PERMISSION);

                        // If any permission aboe not allowed by user, this condition will execute every tim, else your else part will work
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

Перезаписать метод onRequestPermissionsResult:

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    Log.e("Req Code", "" + requestCode);
    if (requestCode == REQUEST_CODE_PERMISSION) {
        if (grantResults.length == mPermission.size())             {
            for(int i=0;i<grantResults.length;i++)
            {
                if(grantResults[i] == MockPackageManager.PERMISSION_GRANTED)
                {
               //don't do anything....
                }
                else{
                    mPermission=new ArrayList<String>();
                    requestPermission();
                    break;
                }
            }

        }
        else{
            Toast.makeText(this,"permition not granted",Toast.LENGTH_LONG).show();
            mPermission=new ArrayList<String>();
            requestPermission();
        }
    }

}
person Arun kumar    schedule 17.04.2017
comment
Сэр, ваш код запрашивает несколько разрешений камеры и хранилища, и в моем случае мне нужно только разрешение камеры. - person Arjun Thakuri; 17.04.2017
comment
Вы можете использовать только разрешение камеры для удаления лишнего кода. Я добавил, потому что если вы используете камеру, вам нужно будет сохранить захваченное изображение, и для этого вам также потребуются другие разрешения. - person Arun kumar; 17.04.2017

сделать так:

if (ContextCompat.checkSelfPermission(UserProfileActivity.this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {

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

        } else {
           //start flashlight

        }




@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {

        switch (requestCode) {

            case 5: {
                for (int i = 0; i < permissions.length; i++) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {

                        //start flashlight
                        Log.d("Permissions CAMERA", "Permission Granted: " + permissions[i]);


                    } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                        Log.d("Permissions CAMERA", "Permission Denied: " + permissions[i]);


                    }
                }
                break;
            }
            default: {
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            } break;
        }
}
person Divyesh Patel    schedule 17.04.2017
comment
Приведенный выше код показывает несколько проблем, таких как: не удается разрешить символ UserProfileActivity, не удается разрешить символ do и не удается разрешить работу символа. однако @override не имеет никаких проблем. - person Arjun Thakuri; 17.04.2017
comment
UserProfileActivity — это имя вашей активности. и DO CAMERA WORK означает поместить туда логику захвата вашей камеры. в этот раз у вас есть разрешение на использование камеры, так что вы можете работать с камерой без каких-либо проблем - person Divyesh Patel; 17.04.2017
comment
Хорошо, но как удалить красные метки, говорящие о том, что не удается разрешить символ UserProfileActivity, Do & Work? - person Arjun Thakuri; 17.04.2017
comment
для UserProfileActivity вы можете указать this или YOURCLASSNAME.this. для дела и работы используйте камеру для захвата изображения - person Divyesh Patel; 17.04.2017
comment
в вашем случае в DO CAMERA WORK запустите функцию фонарика. и в Log.d (Разрешения КАМЕРА, Разрешение предоставлено: + разрешения [i]); также запустить функцию фонарика - person Divyesh Patel; 17.04.2017

У меня тоже была такая же проблема, но мне удалось ее исправить. Вот мой случай (не знаю, такой же как у вас, но попробовать стоит)

Итак, у меня есть два действия, а именно: MainActivity и FlashlightActivity.

Раньше я явно запрашивал разрешение камеры в FlaslightActivity непосредственно перед нажатием кнопки переключения, но я забыл, что проверял, есть ли камера на телефоне пользователя в методе onCreate(). пока я спрашивал разрешения onClick кнопки переключения фонарика, в котором это было после того, как я проверил, есть ли в телефоне пользователя камера. Итак, что я сделал, так это попросил разрешения в моем MainActivity непосредственно перед тем, как начать FlashlightActivity.

flashBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(hasPermission()){
                Intent flashIntent = new Intent("FlashlightActivity");
                startActivity(flashIntent);
            }else{
                requestPermission();
            }
        }
    });

Так что в основном спрашивайте разрешения, прежде чем вызывать какие-либо вещи, связанные с камерой.

person Michael Angelo Cadavillo    schedule 08.06.2017