android - java.lang.SecurityException: Permission Denial: starting Intent with IMAGE_CAPTURE -
i'm debugging application on nexus 5 android m 6.0.1 , i'm getting problems camera's permissions. in application need open camera when button clicked, throws me exception:
04-06 14:03:25.213 15330-15330/clyky.cartracker w/system.err: java.lang.securityexception: permission denial: starting intent { act=android.media.action.image_capture flg=0x3 cmp=com.google.android.googlecamera/com.android.camera.activity.captureactivity clip={text/uri-list u:file:///storage/emulated/0/tesseractsample/imgs/ocr.jpg} (has extras) } processrecord{50bae23 15330:clyky.cartracker/u0a117} (pid=15330, uid=10117) revoked permission android.permission.camera 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.os.parcel.readexception(parcel.java:1666) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.os.parcel.readexception(parcel.java:1619) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.app.activitymanagerproxy.startactivity(activitymanagernative.java:2658) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.app.instrumentation.execstartactivity(instrumentation.java:1507) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.app.activity.startactivityforresult(activity.java:3930) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.support.v4.app.basefragmentactivityjb.startactivityforresult(basefragmentactivityjb.java:50) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.support.v4.app.fragmentactivity.startactivityforresult(fragmentactivity.java:79) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.app.activity.startactivityforresult(activity.java:3890) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.support.v4.app.fragmentactivity.startactivityforresult(fragmentactivity.java:859) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ clyky.cartracker.activities.addvehicleactivity.startcameraactivity(addvehicleactivity.java:99) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ clyky.cartracker.activities.addvehicleactivity.access$000(addvehicleactivity.java:35) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ clyky.cartracker.activities.addvehicleactivity$1.onclick(addvehicleactivity.java:66) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.view.view.performclick(view.java:5204) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.view.view$performclick.run(view.java:21156) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.os.handler.handlecallback(handler.java:739) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.os.handler.dispatchmessage(handler.java:95) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.os.looper.loop(looper.java:148) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ android.app.activitythread.main(activitythread.java:5458) 04-06 14:03:25.226 15330-15330/clyky.cartracker w/system.err: @ java.lang.reflect.method.invoke(native method) 04-06 14:03:25.227 15330-15330/clyky.cartracker w/system.err: @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:726) 04-06 14:03:25.227 15330-15330/clyky.cartracker w/system.err: @ com.android.internal.os.zygoteinit.main(zygoteinit.java:616) i've added permission of read/write external folder , camera in manifest:
<uses-permission android:name="android.permission.camera"/> <uses-permission android:name="android.permission.read_external_storage"/> <uses-permission android:name="android.permission.write_external_storage"/> this method try start camera:
private void startcameraactivity() { try { log.d("debug", "sto provando lanciare la fotocamera"); string imgs_path = environment.getexternalstoragedirectory().tostring() + "/tesseractsample/imgs"; preparedirectory(imgs_path); string img_path = imgs_path + "/ocr.jpg"; outputfileuri = uri.fromfile(new file(img_path)); final intent takepictureintent = new intent(mediastore.action_image_capture); takepictureintent.putextra(mediastore.extra_output, outputfileuri); if (takepictureintent.resolveactivity(getpackagemanager()) != null) { startactivityforresult(takepictureintent, photo_request_code); } } catch (exception e) { e.printstacktrace(); } } i think problem ask camera's permissions never shown. when activity launched asks me read/write external storage, never camera. i've taken code permissions on web. uses class:
public class requestpermissionstooltoolimpl implements requestpermissionstool { private static final string confirmation_dialog = "confirmationdialog"; private static final string tag = requestpermissionstooltoolimpl.class.getsimplename(); private activity activity; @override public void requestpermissions(activity activity, string[] permissions) { log.d("debug", "sto chiedendo permessi."); int x = 0; map<integer, string> permissionsmap = new hashmap<>(); this.activity = activity; (int = 0; < permissions.length; i++) { permissionsmap.put(i, permissions[i]); } (map.entry<integer, string> permission : permissionsmap.entryset()) { if (!ispermissiongranted(activity, permission.getvalue())) { if (activitycompat.shouldshowrequestpermissionrationale(activity, permission.getvalue())) { confirmationdialog.newinstance(permission.getkey(), permission.getvalue()).show(activity.getfragmentmanager(), confirmation_dialog); } else { activitycompat.requestpermissions(activity, permissions, permission.getkey()); return; } } } } @override public boolean ispermissionsgranted(context context, string[] permissions) { (string permission : permissions) { if (!ispermissiongranted(context, permission)) { return false; } } return true; } @override public void onpermissiondenied() { errordialog.newinstance("permission needs"). show(activity.getfragmentmanager(), confirmation_dialog); } private boolean ispermissiongranted(context context, string permission) { return activitycompat.checkselfpermission(context, permission) == packagemanager.permission_granted; } /** * shows ok/cancel confirmation dialog permission. */ public static class confirmationdialog extends dialogfragment { private static final string arg_permission = "permission"; private static final string arg_request_code = "request_code"; public static confirmationdialog newinstance(int permissionkey, string permissionvalue) { confirmationdialog dialog = new confirmationdialog(); bundle bundle = new bundle(); bundle.putstring(arg_permission, permissionvalue); bundle.putint(arg_request_code, permissionkey); dialog.setarguments(bundle); return dialog; } @override public dialog oncreatedialog(bundle savedinstancestate) { return new alertdialog.builder(getactivity()) .setmessage("please allow permission") .setpositivebutton(android.r.string.ok, new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { activitycompat.requestpermissions(getactivity(), new string[]{getarguments().getstring(arg_permission)}, getarguments().getint(arg_request_code)); } }) .setnegativebutton(android.r.string.cancel, new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { toast.maketext(getactivity(), "not available", toast.length_short).show(); } }) .create(); } } /** * shows error message dialog. */ public static class errordialog extends dialogfragment { private static final string arg_message = "message"; public static errordialog newinstance(string message) { errordialog dialog = new errordialog(); bundle args = new bundle(); args.putstring(arg_message, message); dialog.setarguments(args); return dialog; } @override public dialog oncreatedialog(bundle savedinstancestate) { final activity activity = getactivity(); return new alertdialog.builder(activity) .setmessage(getarguments().getstring(arg_message)) .setpositivebutton(android.r.string.ok, new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialoginterface, int i) { //nothing } }) .create(); } } } and these methods in activity uses permissions:
private void requestpermissions() { string[] permissions = new string[]{manifest.permission.write_external_storage}; requesttool = new requestpermissionstooltoolimpl(); requesttool.requestpermissions(this, permissions); } @override public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) { boolean grantedallpermissions = true; (int grantresult : grantresults) { if (grantresult != packagemanager.permission_granted) { grantedallpermissions = false; } } if (grantresults.length != permissions.length || (!grantedallpermissions)) { requesttool.onpermissiondenied(); } else { super.onrequestpermissionsresult(requestcode, permissions, grantresults); } }
use simple piece of code open camera in android m or after versions
public static final int request_camera = 111; void checkpermissiontoopencamera(){ if (build.version.sdk_int >= android.os.build.version_codes.m) { if (activitycompat.checkselfpermission(profileactivity.this, manifest.permission.camera) != packagemanager.permission_granted && activitycompat.checkselfpermission(profileactivity.this, manifest.permission.write_external_storage) != packagemanager.permission_granted) { if (activitycompat.shouldshowrequestpermissionrationale(profileactivity.this, manifest.permission.camera)) { alertdialog.builder alertbuilder = new alertdialog.builder(profileactivity.this); alertbuilder.setcancelable(false); alertbuilder.settitle("permission necessary"); alertbuilder.setmessage("camera , gallery permissions necessary"); alertbuilder.setpositivebutton(android.r.string.yes, new dialoginterface.onclicklistener() { @targetapi(build.version_codes.jelly_bean) public void onclick(dialoginterface dialog, int which) { activitycompat.requestpermissions(profileactivity.this, new string[]{manifest.permission.camera, manifest.permission.write_external_storage}, request_camera); } }); alertdialog alert = alertbuilder.create(); alert.show(); } else { activitycompat.requestpermissions(profileactivity.this, new string[]{manifest.permission.camera, manifest.permission.write_external_storage}, request_camera); } } else { startcameraactivity(); } } else { startcameraactivity(); } } check permission status accept or decline made check in onrequestpermissionsresult :
@override public void onrequestpermissionsresult(int requestcode, string[] permissions, int[] grantresults) { switch (requestcode) { case request_camera: if (grantresults.length > 0 && grantresults[0] == packagemanager.permission_granted) { startcameraactivity(); } else { log.d(tag,"you not able upload profile picture"); } break;
Comments
Post a Comment