java.lang.SecurityException: Permission Denial: starting Intent { act=android.med 安卓7.0

本文详细解析了在Android开发中遇到的相机权限冲突问题,特别是动态权限与本地权限的冲突导致的java.lang.SecurityException异常。通过注释掉Manifest文件中的camera权限声明,成功解决了MainActivity在调用相机功能时出现的权限拒绝错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发中遇到

 java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.huawei.camera/.ThirdCamera clip={text/uri-list U:content://customer.huyi.com.huyicustomer.fileprovider/my_images/Android/data/customer.huyi.com.huyicustomer/cache/output_image.jpg} (has extras) } from ProcessRecord{7bb8683 25917:customer.huyi.com.huyicustomer/u0a385} (pid=25917, uid=10385) with revoked permission android.permission.CAMERA
        at android.os.Parcel.createException(Parcel.java:1953)
        at android.os.Parcel.readException(Parcel.java:1921)
        at android.os.Parcel.readException(Parcel.java:1871)
        at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:3733)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1753)
        at android.app.Activity.startActivityForResult(Activity.java:4781)
        at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
        at android.app.Activity.startActivityForResult(Activity.java:4721)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:744)
        at customer.huyi.com.huyicustomer.activity.MainActivity$onCreate$1.onClick(MainActivity.kt:67)
        at android.view.View.performClick(View.java:6652)
        at android.view.View.performClickInternal(View.java:6624)
        at android.view.View.access$3100(View.java:787)
        at android.view.View$PerformClick.run(View.java:26213)
        at android.os.Handler.handleCallback(Handler.java:891)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:7470)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
     Caused by: android.os.RemoteException: Remote stack trace:

这个问题   是因为这个

startActivityForResult(intent, TAKE_PHOTO)

原理里面添加了动态权限,不能与本地权限有冲突

<!--<uses-permission android:name="android.permission.CAMERA" />-->我把Mainfest文件中的这句注释掉就好了

   

<think>好的,我现在需要解决用户在Android应用中使用拍照权限时遇到的SecurityException问题。用户提到错误信息是关于权限被拒绝,具体是CAMERA权限被撤销了。首先,我得分析可能的原因,然后一步步给出解决方案。 首先,用户可能在调用相机Intent时,没有正确请求或检查CAMERA权限。根据Android权限模型,从Android 6.0(API 23)开始,危险权限需要在运行时动态申请。即使应用在清单文件中声明了权限,如果没在运行时处理,也会导致权限被拒绝。 接下来,我需要确认用户是否正确处理了运行时权限。可能的情况包括:忘记在Activity或Fragment中请求权限,或者用户拒绝了权限请求后没有正确处理。此外,某些设备厂商可能有自定义的权限管理,比如华为,这可能影响权限的授予状态。 然后,错误信息中的ThirdCamera可能涉及隐式Intent的问题。如果应用尝试启动特定厂商的相机组件(如华为的com.huawei.camera/.ThirdCamera),可能需要额外的权限处理。不过,通常推荐使用系统默认的相机应用,而不是指定特定组件,以避免兼容性问题。 接下来,用户可能没有正确处理返回的Uri。当使用ACTION_IMAGE_CAPTURE时,需要指定一个保存图片的Uri,并且要确保目标位置有正确的文件权限。这可能需要使用FileProvider来避免FileUriExposedException。 可能的解决步骤包括: 1. 检查AndroidManifest.xml中是否声明了CAMERA权限和必要的特性(如<uses-feature>)。 2. 在运行时动态请求CAMERA权限,处理用户授权结果。 3. 确保使用FileProvider来生成content:// Uri,特别是在Android 7.0及以上版本。 4. 使用隐式Intent调用系统相机,而不是指定特定组件。 5. 处理用户拒绝权限后的场景,例如提示用户手动开启权限。 另外,需要注意在onActivityResult中处理返回的数据,并确认保存图片的路径有效。同时,某些设备可能有后台权限管理,应用在后台时可能被拒绝权限,需确保相机调用在前台进行。 最后,建议用户检查代码中权限请求和处理的逻辑,确保每一步都正确实现,并测试在不同设备和系统版本上的表现。</think>### 问题分析: 您遇到的 `SecurityException: Permission Denial` 错误,直接原因是 **相机权限(CAMERA)被系统判定为未授予**,但可能涉及以下深层逻辑: --- ### 原因 1:未正确请求运行时权限 **Android 6.0+ 要求动态申请危险权限**(即使已在 `AndroidManifest.xml` 中声明)。 #### 解决方法: 1. **检查清单文件** 确保 `AndroidManifest.xml` 包含: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> ``` 2. **动态请求权限** 在启动相机前检查并请求权限: ```java // Kotlin 示例(Activity/Fragment 中) private val REQUEST_CAMERA_PERMISSION = 1001 fun checkCameraPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.CAMERA), REQUEST_CAMERA_PERMISSION ) } else { startCamera() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, grantResults: IntArray ) { if (requestCode == REQUEST_CAMERA_PERMISSION) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startCamera() } else { // 提示用户权限被拒绝 } } } ``` --- ### 原因 2:未正确处理权限拒绝场景 用户可能 **首次拒绝权限后,后续未引导重新授权**。 #### 解决方法: - 在 `onRequestPermissionsResult` 中检测用户是否勾选 **“不再询问”**: ```kotlin fun shouldShowRationale(permission: String): Boolean { return ActivityCompat.shouldShowRequestPermissionRationale(this, permission) } ``` - 若返回 `true`,可弹窗解释为何需要权限。 - 若返回 `false`,需引导用户到 **应用设置页手动开启权限**。 --- ### 原因 3:华为设备兼容性问题 华为相机组件 (`com.huawei.camera/.ThirdCamera`) 可能对权限控制更严格。 #### 解决方法: - **改用隐式 Intent 调用系统默认相机**(而非指定组件): ```kotlin val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) if (takePictureIntent.resolveActivity(packageManager) != null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } ``` --- ### 原因 4:未正确处理图片存储路径 使用 `ACTION_IMAGE_CAPTURE` 时需指定图片保存路径的 Uri,**Android 7.0+ 必须使用 FileProvider**。 #### 解决步骤: 1. **配置 FileProvider** 在 `AndroidManifest.xml` 中添加: ```xml <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ``` 2. **创建 `res/xml/file_paths.xml`** ```xml <paths> <external-files-path name="my_images" path="Pictures/" /> </paths> ``` 3. **生成 Content Uri** ```kotlin fun createImageFile(): File { val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES) return File.createTempFile("JPEG_${System.currentTimeMillis()}_", ".jpg", storageDir) } val photoFile = createImageFile() val photoUri = FileProvider.getUriForFile( this, "${packageName}.fileprovider", photoFile ) val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, photoUri) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 临时授权 } ``` --- ### 其他注意事项: 1. **检查权限是否被后台限制** 某些设备(如华为、小米)会在后台回收权限,确保应用处于前台时调用相机。 2. **测试不同 API 版本** 在 `AndroidManifest.xml` 中设置 `android:requestLegacyExternalStorage="true"` 以兼容 Android 10+ 作用域存储。 3. **错误日志定位** 若问题持续,检查 `adb logcat` 中是否有其他关联错误(如 FileProvider 路径配置错误)。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值