相机权限不适用于Marshmallow及以上设备和崩溃

时间:2017-04-17 12:06:27

标签: android android-6.0-marshmallow android-permissions android-7.1-nougat

由于我制作了一个手电筒应用程序,它可以在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

中测试我的应用

6 个答案:

答案 0 :(得分:2)

您需要在清单中添加SDK 23权限。在清单中添加以下行,然后您将获得运行时权限回调。

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

答案 1 :(得分:1)

只有你的代码完美无缺,才能改变,

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


    }

}

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


        }

    }

答案 2 :(得分:1)

使用以下代码并调用&#34; requestPermission&#34; onCreate of Activity中的方法:

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

覆盖方法&#34; onRequestPermissionsResult&#34;:

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

}

答案 3 :(得分:1)

if(currentAPIVersion>= 23)
        {
            if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {

                if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                        Manifest.permission.CAMERA)) {

                    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
                    alertBuilder.setCancelable(true);
                    alertBuilder.setTitle("Camera Permission Necessary");
                    alertBuilder.setMessage("Camera permission is necessary");
                    alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions((Activity) context,
                                    new String[]{Manifest.permission.CAMERA},
                                    MY_PERMISSIONS_REQUEST_CAMERA);
                        }
                    });
                    AlertDialog alert = alertBuilder.create();
                    alert.show();

                } else {
                    ActivityCompat.requestPermissions((Activity) context,
                            new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);
                }
                return false;
            } else {
                return true;
            }
        } else {
            return true;
        }

答案 4 :(得分:0)

这样做:

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

答案 5 :(得分:0)

我也有同样的问题,但设法修复它。这是我的情况(我不知道它是否与你的相同,但值得一试)

所以我有两个活动:MainActivityFlashlightActivity

我曾经在点击开关按钮之前在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();
            }
        }
    });

所以在你调用任何与相机有关的东西之前,基本上都要求获得许可