Android M - 相机权限问题
Android M - camera permissions issue
我在 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" />
请协助。
首先,您没有调用 Camerapermission()
方法,至少就您问题中显示的代码而言是这样。
其次,您允许用户使用触发对 openCamera()
的调用的 RadioButton
做一些奇怪的事情,而不检查您是否有权使用相机。例如,您可以使用 checkSelfPermission()
来查看您是否有权限,只有在有权限时才启用 RadioButton
。
您不妨阅读更多有关 the runtime permission system 的内容。
将此添加到您的清单中:
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
文档中的引用:
http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions
可能您使用的设备 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" />
请协助。
首先,您没有调用 Camerapermission()
方法,至少就您问题中显示的代码而言是这样。
其次,您允许用户使用触发对 openCamera()
的调用的 RadioButton
做一些奇怪的事情,而不检查您是否有权使用相机。例如,您可以使用 checkSelfPermission()
来查看您是否有权限,只有在有权限时才启用 RadioButton
。
您不妨阅读更多有关 the runtime permission system 的内容。
将此添加到您的清单中:
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
文档中的引用:
http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions
可能您使用的设备 Android M,因此请为该应用授予适当的权限:设置 -> 应用 -> 您的应用
如果这没有帮助,请看这个