摄像头权限不适用于棉花糖及以上设备和崩溃

问题描述:

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

+0

尝试uninstall->安装,看看它的请求许可。可能发生的情况是,你点击了“再也不要问了”复选框 –

+0

不要求它根本不要求许可,它只是崩溃。但如果我手动允许权限,则应用程序工作正常,正如我在setting-app-permission-allow中所述。 –

只要你改变只有当条件你的代码是完美的这个样子,

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


     } 

    } 

做到这一点的方法:

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

上面的代码显示了几个问题:无法解析符号UserProfileActivity,无法解析符号do&不能解析符号工作。然而@override没有任何问题。 –

+0

UserProfileActivity是您的活动名称。并且摄像机工作意味着将相机捕获逻辑放在那里。那时你有摄像头权限,这样你就可以在没有任何问题的情况下进行摄像头工作了 –

+0

好吧,但是我该如何删除表示无法解析符号的红色标记UserProfileActivity,Do&Work? UserProfileActivity的 –

使用下面的代码并在Activity的onCreate中调用“requestPermission”方法:

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

} 
+0

先生您的代码是要求多个权限的相机和存储,在我的情况下,我只需要相机的权限。 –

+0

您只能使用相机权限删除额外的代码。我补充说,因为如果你使用相机,那么你将需要保存捕获的图像,因此您还需要其他权限。 –

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

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

所以我有这两项活动,即:MainActivityFlashlightActivity

在我点击开关按钮之前,我曾经在FlaslightActivity中明确要求相机权限,但我忘记了我是在检查用户手机是否在onCreate()方法中有相机。而我在询问手电筒开关按钮的许可onClick,其中之后我检查了用户的手机是否有相机。所以我所做的就是在我开始FlashlightActivity之前在我的MainActivity中请求许可。

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

所以基本上索要许可打电话之前任何相机相关的东西