情况:当相机(图像视图)被点击时,它将提示多个权限。
下面是代码(扩展片段):
private static String[] PERMISSIONS_CAMERA = {Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
img_1 = (ImageView) view.findViewById(R.id.img_1);
img_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startCamera();
}
});
private void StartCamera() {
requestPermissions(PERMISSIONS_CAMERA, REQUEST_CAMERA);
}
private void OpenCamera() {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CAMERA);
this.bitmap = null;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
// For camera
case REQUEST_CAMERA:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
OpenCamera();
} else {
Toast.makeText(getActivity(), "Go to settings and enable permissions", Toast.LENGTH_LONG).show();
}
break;
}
}错误日志:
java.lang.RuntimeException: Failure delivering result
ResultInfo{who=@android:requestPermissions:, request=131073,
result=-1, data=Intent {
act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to
activity {app.swb.mont/app.swb.mont.ui.activity.MainActivity}:
java.lang.SecurityException: Permission Denial: starting Intent {
act=android.media.action.IMAGE_CAPTURE
cmp=com.sec.android.app.camera/.Camera } from ProcessRecord{b2f7ceb
28260:app.swb.mont/u0a392} (pid=28260, uid=10392) with revoked
permission android.permission.CAMERA at android.app.ActivityThread.deliverResults(ActivityThread.java:4925)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4968)
at android.app.ActivityThread.access$1600(ActivityThread.java:222)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1849)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE
cmp=com.sec.android.app.camera/.Camera } from ProcessRecord{b2f7ceb
28260:app.swb.mont/u0a392} (pid=28260, uid=10392) with revoked
permission android.permission.CAMERA发布于 2016-11-18 10:51:12
问题是您没有正确地处理onRequestPermissionResult。这条线上
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
OpenCamera();}您只检查您所请求的女巫在本例中是Manifest.permission.READ_EXTERNAL_STORAGE (位置== 0)的第一个权限,并且触发您的相机功能,它需要在位置== 2处获得许可。
解决方案
if (grantResults.length > 0 && grantResults[2] == PackageManager.PERMISSION_GRANTED) {
OpenCamera();}或
if (grantResults.length > 0 && (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[2] == PackageManager.PERMISSION_GRANTED) ) {
OpenCamera();}//还可以使用循环
发布于 2016-11-18 10:51:14
这是因为您只检查第一权限结果,而不检查第二:grantResults[0] == PackageManager.PERMISSION_GRANTED。您还需要检查grantResults[1] == PackageManager.PERMISSION_GRANTED
发布于 2016-11-18 11:01:14
如果您的要求是,如果所有的权限给定,那么只有它必须工作,您可以这样做
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
// For camera
case REQUEST_CAMERA:
if (grantResults.length > 0) {
boolean permGiven = true;
for(int i=0; i<grantResults.length; i++){
if(grantResults[i] != PackageManager.PERMISSION_GRANTED)
permGiven = false;
}
if(permGiven)
OpenCamera();
else
Toast.makeText(MainActivity.this, "Go to settings and enable permissions", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this, "Go to settings and enable permissions", Toast.LENGTH_LONG).show();
}
break;
}
}https://stackoverflow.com/questions/40674939
复制相似问题