Android扫描应用QR功能及图库访问权限问题求助
安卓文档扫描应用权限问题排查方案
问题详情
- 应用的文档扫描、保存、分享功能正常,但启动QR阅读器、QR生成器或从图库选择图片时,弹出错误提示:
"you have forcefully denied some of the required permissions for this action. please open setting, go to permissions and allow them"
- 已手动授予Camera及所有请求的权限,问题仍未解决,以下是应用的Manifest文件内容:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.Pdf.scanner"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <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" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:name="com.Pdf.scanner.MyApp" android:allowBackup="true" android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:networkSecurityConfig="@xml/network_security_config" android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.CamScanner" android:usesCleartextTraffic="true"> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true" tools:replace="android:authorities,android:exported"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" tools:replace="android:resource" /> </provider> <activity android:name="com.scanlibrary.ScanActivity" android:configChanges="orientation|screenSize" android:exported="false" android:label="@string/app_name" > </activity> <activity android:name="com.Pdf.scanner.activity.BaseActivity" android:exported="true" ></activity> <activity android:name="com.Pdf.scanner.activity.LangSupportBaseActivity" android:exported="false"/> <activity android:name="com.Pdf.scanner.activity.LanguageSelectionActivity" android:exported="false"/> <activity android:name="com.Pdf.scanner.activity.SplashActivity" android:resizeableActivity="false" android:exported="true" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.Pdf.scanner.activity.MultiEditActivity" android:exported="true" android:screenOrientation="portrait"></activity> <activity android:name="com.Pdf.scanner.activity.MainActivity" android:screenOrientation="portrait" android:exported="true" android:windowSoftInputMode="adjustPan" /> <activity android:name="com.Pdf.scanner.activity.ScannerActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.yalantis.ucrop.UCropActivity" android:exported="true" android:screenOrientation="portrait" android:theme="@style/uCropStyle" /> <activity android:name="com.Pdf.scanner.activity.IDCardPreviewActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.CropDocumentActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.CurrentFilterActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.SavedDocumentActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.DocumentEditorActivity" android:exported="false" android:screenOrientation="portrait" android:windowSoftInputMode="adjustNothing" /> <activity android:name="com.Pdf.scanner.activity.SavedEditDocumentActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.SavedDocumentPreviewActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.NoteActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.ImageToTextActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.GroupDocumentActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.PDFViewerActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.QRGenerateActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.QRReaderActivity" android:exported="true" android:screenOrientation="portrait" /> <activity android:name="com.Pdf.scanner.activity.PrivacyPolicyActivity" android:exported="true" android:screenOrientation="portrait" /> <meta-data android:exported="true" android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="ocr" /> <meta-data android:exported="true" android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="@string/admob_app_id" /> <activity android:name="com.nguyenhoanglam.imagepicker.ui.imagepicker.ImagePickerActivity" android:configChanges="orientation|screenSize" android:exported="false" android:theme="@style/imagepicker_ImagePickerTheme" /> <activity android:name="com.nguyenhoanglam.imagepicker.ui.camera.CameraActivity" android:screenOrientation="unspecified" android:theme="@style/imagepicker_CameraTheme" android:exported="false" tools:replace="android:screenOrientation" /> <receiver android:name="com.onesignal.FCMBroadcastReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > </manifest>
排查与解决步骤
1. 补全适配Android 13+的存储权限
Android 13及以上版本,访问图库图片需要READ_MEDIA_IMAGES权限,而非旧的READ_EXTERNAL_STORAGE,在Manifest中添加:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33"/>
2. 检查动态权限请求逻辑
- QR阅读器:确认
QRReaderActivity启动前,是否通过ActivityCompat.requestPermissions()动态请求CAMERA权限,并且处理了用户拒绝(包括“不再询问”的场景),避免仅依赖Manifest声明。 - 图库选择:针对Android 13+请求
READ_MEDIA_IMAGES,Android 10及以下请求READ_EXTERNAL_STORAGE,确保权限请求逻辑适配对应系统版本。
3. 修正权限状态判断代码
检查触发错误提示的权限校验逻辑,确保使用ContextCompat.checkSelfPermission()准确判断权限状态,避免自定义逻辑误判(比如把“已授权”状态错误识别为“拒绝”)。
4. 排查第三方库权限依赖
项目中使用的com.nguyenhoanglam.imagepicker图片选择库,可能需要额外权限,查看该库的官方文档,确认是否有遗漏的权限声明。
5. 清除应用权限缓存
让用户尝试清除应用数据/缓存,然后重新授予所有权限,排除系统权限状态缓存导致的异常。
内容的提问来源于stack exchange,提问作者earn Crypto
相关产品推荐
相关产品推荐

