-1

由於我已經制作了手電筒應用程序,它可以在具有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中所述。 –

回答

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


     } 

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

上面的代碼顯示了幾個問題:無法解析符號UserProfileActivity,無法解析符號do&不能解析符號工作。然而@override沒有任何問題。 –

+0

UserProfileActivity是您的活動名稱。並且攝像機工作意味着將相機捕獲邏輯放在那裏。那時你有攝像頭權限,這樣你就可以在沒有任何問題的情況下進行攝像頭工作了 –

+0

好吧,但是我該如何刪除表示無法解析符號的紅色標記UserProfileActivity,Do&Work? UserProfileActivity的 –

1

使用下面的代碼並在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

您只能使用相機權限刪除額外的代碼。我補充說,因爲如果你使用相機,那麼你將需要保存捕獲的圖像,因此您還需要其他權限。 –

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

我也有同樣的問題,但設法固定它。這是我的情況(我不知道它是否與你的相同,但值得一試)

所以我有這兩項活動,即: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(); 
      } 
     } 
    }); 

所以基本上索要許可打電話之前任何相機相關的東西