调用系统相机拍照出现java.lang.SecurityException:

本文介绍了一个关于Android应用中启动相机功能时遇到的安全异常问题及其解决方案。问题表现为启动相机时出现java.lang.SecurityException异常,原因是Camera权限被撤销。文中提供了一段示例代码,展示了如何在运行时检查并请求Camera权限。

具体问题:
java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera/.Camera clip={text/uri-list U:content://media/external/images/media/59625} (has extras) } from ProcessRecord{51c6155 13371:com.powervision.gcs/u0a508} (pid=13371, uid=10508) with revoked permission android.permission.CAMERA
这个安全异常是starting Intent时引起的,具体代码:

Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

最后面的提示是with revoked permission android.permission.CAMERA,因为Camera权限是一个危险权限,这儿在调用相机时需要去动态判断这个权限(sdk>22),增加权限验证后问题解决,一下为代码:

    /**
     * 检查拍照权限
     */
    private void checkPermission() {
        if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // 进入这儿表示没有权限
            if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, Manifest.permission.CAMERA)) {
                // 提示已经禁止
                ToastUtil.longToast(mContext, getString(R.string.you_have_cut_down_the_permission));
            } else {
                ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.CAMERA}, 100);
            }
        } else {
            takePhotoByCamera();
        }
    }
D UserAwareMgr: begin releaseSysResource eventId: 1006, appPid: 0, callingPid: 1743, callingUid: 1000 10-11 17:05:52.284274 1743 1841 D UserAwareMgr: stop scene event 1006 success, caller: 1743,appPid=0 10-11 17:05:52.285818 4567 5193 D PipelineWatcher: [0xb4000075855c6908] pipelineFull: too many frames in pipeline (4) 10-11 17:05:52.285909 12602 12602 I OplusThemeManager: updateExtraConfigForUxIcon changes = 536872064; callers:oplus.android.OplusCommonInjector.applyConfigurationToResourcesForResourcesManager:95 android.app.ResourcesManagerExtImpl.applyConfigurationToResources:165 android.app.ResourcesManager.applyConfigurationToResources:1625 android.app.ConfigurationController.handleConfigurationChangedInner:229 android.app.ConfigurationController.handleConfigurationChanged:167 android.app.ConfigurationController.handleConfigurationChanged:142 android.app.ActivityThread.handleConfigurationChanged:7531 android.app.servertransaction.ConfigurationChangeItem.execute:56 android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem:138 android.app.servertransaction.TransactionExecutor.executeTransactionItems:108 10-11 17:05:52.287765 7512 7512 I OplusThemeManager: updateExtraConfigForUxIcon changes = 536872064; callers:oplus.android.OplusCommonInjector.applyConfigurationToResourcesForResourcesManager:95 android.app.ResourcesManagerExtImpl.applyConfigurationToResources:165 android.app.ResourcesManager.applyConfigurationToResources:1625 android.app.ConfigurationController.handleConfigurationChangedInner:229 android.app.ConfigurationController.handleConfigurationChanged:167 android.app.ConfigurationController.handleConfigurationChanged:142 android.app.ActivityThread.handleConfigurationChanged:7531 android.app.servertransaction.ConfigurationChangeItem.execute:56 android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem:138 android.app.servertransaction.TransactionExecutor.executeTransactionItems:108 10-11 17:05:52.288340 15693 15693 E ServiceManager: error in isDeclared java.lang.SecurityException: SELinux denied for service. at android.os.Parcel.createExceptionOrNull(Parcel.java:3370) at android.os.Parcel.createException(Parcel.java:3354) at android.os.Parcel.readException(Parcel.java:3337) at android.os.Parcel.readException(Parcel.java:3279) at android.os.IServiceManager$Stub$Proxy.isDeclared(IServiceManager.java:656) at android.os.ServiceManagerProxy.isDeclared(ServiceManagerNative.java:104) at android.os.ServiceManager.isDeclared(ServiceManager.java:297) at android.os.ServiceManager.waitForDeclaredService(ServiceManager.java:353) at com.mediatek.socket.base.UdpServer.lbsHalInit(UdpServer.java:110) at com.mediatek.socket.base.UdpServer.<init>(UdpServer.java:145) at com.mediatek.gnssdebugreport.MnldConn.<init>(MnldConn.java:76) at com.mediatek.gnssdebugreport.GnssDebugReportServiceStub.<init>(GnssDebugReportServiceStub.java:35) at com.mediatek.gnssdebugreport.GnssDebugReportService.onCreate(GnssDebugReportService.java:17) at android.app.ActivityThread.handleCreateService(ActivityThread.java:5654) at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2856) at android.os.Handler.dispatchMessage(Handler.java:115) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.app.ActivityThread.main(ActivityThread.java:9952) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074) 10-11 17:05:52.288453 15693 15693 D GnssDebugReport/UdpServer: Try to find ILbs HIDL: mtk_mnld2debugService 10-11 17:05:52.292158 2559 10917 I APS_CORE: [INFO][ BLOCK ] APSClientAdapter.cpp: 1884 fillPreviewParams() index: 0 (imageBuffer: 0x3d6a, 15722) 10-11 17:05:52.292233 12602 12602 D AIUnit-q5.n1760173426041: AIUnit-q5.n1760173426041: onConfigurationChanged {1.0 ?mcc??mnc [zh_BD_#Hans] ldltr sw360dp w360dp h791dp 480dpi nrml long widecg port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2372) mAppBounds=Rect(0, 0 - 1080, 2372) mMaxBounds=Rect(0, 0 - 1080, 2372) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.127 fontWeightAdjustment=0mThemeChanged= 0, mThemeChangedFlags= 0, mFlipFont= 0, mScenario= 0, mAccessibleChanged= -1, mUxIconConfig= 1e177015e00021, mMaterialColor= 0, mUserId= 0, mFontUserId= 0, mFontVariationSettings= 1226, mFoldingAngle = -1.0, mIconPackName= , mDarkModeBackgroundMaxL= 0.0, mDarkModeDialogBgMaxL= 27.0, mDarkModeForegroundMinL= 100.0, mOplusConfigType= 1, mOplusChangedConfigs= 0, OpSans= -1, mBurmeseFontFlag= 2, mFlag= 0, mExtraFlag= 0, mFlexibleActivitySuitable= -1, mPuttDisplayFlag= -1} 10-11 17:05:52.292369 12602 12602 I AIUnit-Utils: getRegion BD 10-11 17:05:52.292495 2559 10917 I APS_CORE: [INFO][ BLOCK ] APSClientAdapter.cpp: 1167 app_cmd_addPreviewFrameBuff() frameId: 76, timestamp: 2049735091000, role: 0, imageBuffer: 0xb400007461fd7600, logicMetadata: 0xb40000742ca64140, physicMetadata: 0x0 10-11 17:05:52.292621 2559 10988 I APS_CORE: [INFO][ LOGIC ] APSPreviewManager.cpp: 885 checkPreviewBuffer() burstCaptureType: 0, bracketMode: -1, turboRawMode: 0, isForThumbnail: 0, isCachePsl 0 10-11 17:05:52.292949 2559 10988 I APS_CORE: [INFO][ BLOCK ] APSPreviewManager.cpp: 1651 packPreviewResult() res: 0, s这是什么错误
最新发布
10-22
Line 11624: 01-02 16:07:38.066 1864 3648 D TorchManagerService: onTorchModeChanged, mbTorchMode: true, mbDoSetTorchModeFalseByUs: false Line 11627: 01-02 16:07:38.066 3864 4015 I SystemUi--QuickSettings: FlashlightController-->onTorchModeChanged setTorchMode=true cameraId=0 Line 11733: 01-02 16:07:38.225 8570 8570 F DEBUG : #04 pc 0000000000012770 /vendor/lib64/mt6991/libmtkcam_devicemgr.so (NSCam::CameraDeviceManagerBase::setTorchMode(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, unsigned int)+464) (BuildId: d7dac32de39179042a63e9768c3c3cec) Line 11734: 01-02 16:07:38.225 8570 8570 F DEBUG : #05 pc 0000000000010bd0 /vendor/lib64/mt6991/libmtkcam_hal_android_device.so (mcam::android::ACameraDevice::setTorchMode(mcam::android::TorchMode)+96) (BuildId: 06829189d08cf0bd9ebdddfedaf9c685) Line 11735: 01-02 16:07:38.225 8570 8570 F DEBUG : #06 pc 0000000000018080 /vendor/lib64/mt6991/libmtkcam_hal_aidl_device.so (mcam::aidl::AidlCameraDevice::setTorchMode(bool)+304) (BuildId: 0e4806974081ccb6822e9018551e3626) Line 12430: 01-02 16:07:45.215 1411 7059 E cameraserver: setTorchMode Unable to set torch mode: Line 12432: 01-02 16:07:45.215 1411 7059 E CameraService: setTorchMode: Setting torch mode of camera "0" to 0 failed: Broken pipe (-32) Line 12450: 01-02 16:07:45.218 8532 8554 W roid.camera.cts: Long monitor contention with owner Instr: androidx.test.runner.AndroidJUnitRunner (8561) at void android.hardware.camera2.CameraManager$CameraManagerGlobal.setTorchMode(java.lang.String, boolean, android.content.AttributionSourceState, int)(CameraManager.java:2938) waiters=0 in void android.hardware.camera2.CameraManager$CameraManagerGlobal.onTorchStatusChanged(int, java.lang.String, int) for 7.152s Line 12494: 01-02 16:07:45.219 8532 8561 E TestRunner: android.hardware.camera2.CameraAccessException: CAMERA_ERROR (3): setTorchMode:3299: Setting torch mode of camera "0" to 0 failed: Broken pipe (-32) Line 12496: 01-02 16:07:45.219 8532 8561 E TestRunner: at android.hardware.camera2.CameraManager$CameraManagerGlobal.setTorchMode(CameraManager.java:2933) Line 12497: 01-02 16:07:45.219 8532 8561 E TestRunner: at android.hardware.camera2.CameraManager.setTorchMode(CameraManager.java:1649) Line 12498: 01-02 16:07:45.219 8532 8561 E TestRunner: at android.hardware.camera2.cts.FlashlightTest.resetTorchModeStatus(FlashlightTest.java:420) Line 12542: 01-02 16:07:45.219 8532 8561 E TestRunner: Caused by: android.os.ServiceSpecificException: setTorchMode:3299: Setting torch mode of camera "0" to 0 failed: Broken pipe (-32) (code 10) Line 12547: 01-02 16:07:45.219 8532 8561 E TestRunner: at android.hardware.ICameraService$Stub$Proxy.setTorchMode(ICameraService.java:1311) Line 12548: 01-02 16:07:45.219 8532 8561 E TestRunner: at android.hardware.camera2.CameraManager$CameraManagerGlobal.setTorchMode(CameraManager.java:2930) Line 12610: 01-02 16:07:45.223 1411 7059 E CameraService: setTorchMode: camera id is invalid 0 Line 12612: 01-02 16:07:45.223 3864 4015 E FlashlightController: java.lang.IllegalArgumentException: setTorchMode:3216: Camera ID "0" is a not valid camera ID Line 12614: 01-02 16:07:45.223 3864 4015 E FlashlightController: at android.hardware.camera2.CameraManager$CameraManagerGlobal.setTorchMode(CameraManager.java:2933) Line 12615: 01-02 16:07:45.223 3864 4015 E FlashlightController: at android.hardware.camera2.CameraManager.setTorchMode(CameraManager.java:1649) Line 12622: 01-02 16:07:45.223 3864 4015 E FlashlightController: Caused by: android.os.ServiceSpecificException: setTorchMode:3216: Camera ID "0" is a not valid camera ID (code 3) Line 12627: 01-02 16:07:45.223 3864 4015 E FlashlightController: at android.hardware.ICameraService$Stub$Proxy.setTorchMode(ICameraService.java:1311) Line 12628: 01-02 16:07:45.223 3864 4015 E FlashlightController: at android.hardware.camera2.CameraManager$CameraManagerGlobal.setTorchMode(CameraManager.java:2930) Line 13942: 01-02 16:07:45.914 1864 3648 D TorchManagerService: onTorchModeChanged, mbTorchMode: false, mbDoSetTorchModeFalseByUs: false Line 13947: 01-02 16:07:45.914 3864 4015 I SystemUi--QuickSettings: FlashlightController-->onTorchModeChanged setTorchMode=false cameraId=0
06-17
<think>嗯,用户遇到了一个JavaSecurityException错误,特别是与GoogleApiManager和SELinux相关的问题,具体错误信息是“SELinux denied com.google.android.gms”。我需要帮他们解决这个问题。首先,我应该回忆一下SecurityException的常见原因。根据用户提供的引用内容,SecurityException通常是因为权限检查失败,比如应用没有声明所需的权限,或者在调用某些API时权限不足。 首先,用户提到的错误涉及Google Play服务(com.google.android.gms),所以可能需要检查应用是否正确地声明了相关权限,比如INTERNET、ACCESS_NETWORK_STATE等。另外,可能涉及运行时权限,比如在Android 6.0以上需要动态请求某些权限。不过,如果是GoogleApiManager的问题,可能更多是Google Play服务本身的权限问题,或者是应用与Google Play服务之间的权限配置错误。 接下来,SELinux denied的错误提示说明可能有SELinux策略限制。SELinux在Android中用于增强安全性,但有时候第三方应用或服务可能会因为策略限制而无法执行某些操作,导致权限被拒绝。这时候可能需要查看SELinux的avc日志,分析具体的拒绝原因,然后调整策略。 步骤应该是这样的:首先检查应用权限,确保所有需要的权限都在AndroidManifest.xml中声明,并且如果是运行时权限,已经动态请求。然后,检查Google Play服务的版本是否正确,可能需要更新或重新安装Google Play服务。如果这些都正常,就需要查看SELinux的策略,通过adb logcat获取avc拒绝的日志,根据日志修改sepolicy或添加允许规则。不过,修改SELinux策略可能需要root权限,对于普通应用开发者来说可能不太现实,但如果是系统级应用或定制ROM的话可能可行。 另外,用户提到的错误信息中提到了com.google.android.gms,这可能涉及到Google Play服务的特定权限,比如BATTERY_STATS或者其他系统权限。但普通应用通常不会声明这些权限,所以可能需要检查是否有错误地请求了这些权限,或者Google Play服务在特定环境下需要这些权限。 可能还需要考虑的是,是否在调用Google API时没有正确处理权限检查,比如在访问需要特定权限的API时,没有调用enforcePermission方法,导致SecurityException被抛出。这时候需要确保在调用这些API前进行了正确的权限检查,或者捕获异常并处理。 总结来说,解决方案可能包括以下几个步骤:检查并添加必要的权限、更新Google Play服务、分析SELinux日志并调整策略、确保代码中的权限检查正确。同时,需要分清楚是应用自身的权限问题,还是系统级的SELinux策略限制。</think>### 解决 `java.lang.SecurityException`(GoogleApiManager与SELinux相关) #### 1. **权限问题分析** - **应用权限缺失**:检查应用是否在 `AndroidManifest.xml` 中声明了所需权限(如网络权限、位置权限等)。例如: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` - **运行时权限未请求**:若涉及敏感权限(如定位),需在代码中动态申请权限(针对 Android 6.0+)[^1]。 #### 2. **Google Play服务配置** - **版本兼容性**:确保设备上的 Google Play服务版本与应用兼容,可通过以下代码检查: ```java GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context); ``` - **API密钥合法性**:验证 Google API 密钥是否有效,并正确绑定应用包名和签名。 #### 3. **SELinux策略问题** - **查看AVC日志**:通过 `adb logcat` 过滤 SELinux 拒绝记录: ```bash adb logcat | grep "avc: denied" ``` 示例输出: ``` avc: denied { connectto } for pid=1234 comm="gms" path="/data/socket" scontext=u:r:untrusted_app:s0 tcontext=u:r:init:s0 ``` - **调整SELinux规则**: - 若为系统级应用,可在设备源码的 SELinux 策略文件(`.te` 文件)中添加允许规则,例如: ```te allow untrusted_app init:unix_stream_socket connectto; ``` - 若为普通应用,需联系设备厂商或使用调试模式临时放宽策略。 #### 4. **代码层权限检查** - **显式捕获异常**:在调用 Google API 时添加异常处理: ```java try { // 调用 Google API 的代码 } catch (SecurityException e) { Log.e("SecurityException", "权限被拒绝: " + e.getMessage()); } ``` - **权限验证方法**:参考 `Context.checkCallingOrSelfPermission()` 进行权限检查[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值