2016-03-14 100 views
1

我遇到权限的已知问题在Android中M. 当试图打开相机就出现以下情况例外:版本的Android M - 相机权限问题

java.lang.SecurityException: Permission Denial: starting Intent 
{ act=android.media.action.IMAGE_CAPTURE cmp=com.google.android.GoogleCamera/com.android.camera.CaptureActivity } 
from ProcessRecord{834e30b 8608:il.ac.shenkar.david.todolistex2/u0a126} (pid=8608, uid=10126) with revoked permission android.permission.CAMERA 

这里是我完整的代码,它包括一个解决方法,我在这里找到并为其他人工作,但由于某种原因,我失败了。

public class ReportTaskStatus extends AppCompatActivity{ 

private Task tastToEdit; 
private RadioButton acceptrb; 
private RadioButton statusrb; 
private TextView label; 
private List<ParseObject> tsks=null; 

public Uri fileUri; 
private int CAMERA_REQUEST = 100; 
private int Gallary_REQUEST = 101; 
public static final int MY_PERMISSIONS_REQUEST_CAMERA = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_report_task_status); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    Intent i = getIntent(); 


    tastToEdit = (Task)i.getSerializableExtra("task"); 
    label = (TextView)findViewById(R.id.categorylabel); 
    label.append(" "+tastToEdit.getTask_catg().toString()); 

    label = (TextView)findViewById(R.id.prioritylabel); 
    label.append(" "+tastToEdit.getPriority().toString()); 

    label = (TextView)findViewById(R.id.locationlabel); 
    label.append(" " + Location.fromInteger(tastToEdit.getTsk_location()).toString()); 

    label = (TextView)findViewById(R.id.duetimelabel); 

    if(tastToEdit.getDueDate()!=null) 
    { 
     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
     SimpleDateFormat sdft = new SimpleDateFormat("HH:mm"); 
     label.append(" " + (sdf.format(tastToEdit.getDueDate()))); 
     label.append(" " + (sdft.format(tastToEdit.getDueDate()))); 
    } 

    Task_Status tsk_stts = tastToEdit.getTask_sts(); 

    if(tsk_stts==Task_Status.WAITING) 
    { 
     statusrb = (RadioButton) findViewById(R.id.waitingstatusRBtn); 
     statusrb.setChecked(true); 
    } 
    if(tsk_stts==Task_Status.INPROGESS) 
    { 
     statusrb = (RadioButton) findViewById(R.id.inprogstatusRBtn); 
     statusrb.setChecked(true); 
    } 
    if(tsk_stts==Task_Status.DONE) 
    { 
     statusrb = (RadioButton) findViewById(R.id.donestatusRBtn); 
     statusrb.setChecked(true); 
    } 
    //Get a Tracker (should auto-report) 
    ((MyApplication) getApplication()).getTracker(MyApplication.TrackerName.APP_TRACKER); 

    RadioGroup radioGroup = (RadioGroup) findViewById(R.id.statusgroup); 
    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(RadioGroup group, int checkedId) 
     { 
      RadioButton rb = (RadioButton) findViewById(R.id.donestatusRBtn); 
      if(rb.isChecked()) 
      { 
       Log.w("donestatusRBtn","donestatusRBtn"); 
       openCamera(); 
      } 
     } 
    }); 
} 

private void Camerapermission() { 
    // Here, thisActivity is the current activity 
    if (ContextCompat.checkSelfPermission(ReportTaskStatus.this 
      , 
      Manifest.permission.CAMERA) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(ReportTaskStatus.this, 
       Manifest.permission.CAMERA)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 

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

      // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 
} 

void openCamera() { 
    try { 
     Intent cameraIntent = new Intent(
     android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(cameraIntent, CAMERA_REQUEST); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_CAMERA: { 
      for(int i = 0; i < permissions.length; i++) { 
       if(grantResults[i] == PackageManager.PERMISSION_GRANTED) { 
        Log.d("Permissions", "Permission Granted: " + permissions[i]); 
       } else if(grantResults[i] == PackageManager.PERMISSION_DENIED) { 
        Log.d("Permissions", "Permission Denied: " + permissions[i]); 
       } 
      } 
     } 
     break; 
     default: { 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
} 
} 

权限的manifest.xml

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_CALENDAR" /> 
<uses-permission android:name="android.permission.WRITE_CALENDAR" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 

<uses-feature 
    android:name="android.hardware.camera.any" 
    android:required="true" /> 
<uses-feature 
    android:name="android.hardware.camera.autofocus" 
    android:required="false" /> 

请协助。

回答

2

首先,您不打电话给Camerapermission()方法,至少在您的问题中显示的代码方面。

其次,您允许用户在RadioButton的情况下执行一些奇怪的操作,而不会检查您是否有权使用相机。例如,您可以使用checkSelfPermission()来查看您是否有权限,并且只有在您使用时才能启用RadioButton

您不妨阅读更多关于the runtime permission system的文章。

+0

不能相信我忘了打电话'Camerapermission()'。谢谢。 –

1

与版本的Android M也许您正在使用设备,因此给予相应权限的应用程序:设置 - >应用程序 - >您的应用程序

如果这不帮助看看这个workaround