`

java.lang.SecurityException: Permission Denial: reading...requires android.permi

阅读更多
一直在忙于Gallery,最近遇到了这样的bug,在Setting-->storage&USB->internal storage->images->选择一张-图片> home key exit,然后在Gallery删除选中的那种照片,最后在最近列表里选择Setting,画面仍保留在那张图片,点击打印men,就会报Gallery Force Close.通过log可以看到报以下错:
04-15 11:00:33.959  8427  8427 D AndroidRuntime: Shutting down VM

04-15 11:00:33.965  8427  8427 E AndroidRuntime: FATAL EXCEPTION: main

04-15 11:00:33.965  8427  8427 E AndroidRuntime: Process: com.android.gallery3d, PID: 8427

04-15 11:00:33.965  8427  8427 E AndroidRuntime: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image%3A593 from pid=8427, uid=10065 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()

04-15 11:00:33.965  8427  8427 E AndroidRuntime: 	at android.os.Parcel.readException(Parcel.java:1620)

04-15 11:00:33.965  8427  8427 E AndroidRuntime: 	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)

04-15 11:00:33.965  8427  8427 E AndroidRuntime: 	at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)

04-15 11:00:33.965  8427  8427 E AndroidRuntime: 	at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)

04-15 11:00:33.965  8427  8427 E AndroidRuntime: 	at android.content.ContentResolver.query(ContentResolver.java:493)

04-15 11:00:33.965  8427  8427 E AndroidRuntime: 	at android.content.ContentResolver.query(ContentResolver.java:435)

04-15 11:00:33.965  8427  8427 E AndroidRuntime: 	at com.android.gallery3d.filtershow.cache.ImageLoader.getLocalPathFromUri(ImageLoader.java:85)



没有删除这张照片之前,选择打印是正常的,为何删除了照片就报权限问题了呢?经过代码分析,Gallery是没有权限访问MediaDocumentsProvider,MediaDocumentsProvider是可以接受 android:grantUriPermissions="true"传递权限的,而文件管理器documentsui是申请了 <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />,而文件管理器打开图片会将read的权限通过intent的方式传递了给Gallery:Intent.FLAG_GRANT_READ_URI_PERMISSION

final Intent view = new Intent(Intent.ACTION_VIEW);
            view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            view.setData(doc.derivedUri);

            try {
                startActivity(view);
            } catch (ActivityNotFoundException ex) {
                Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show();
            }

http://androidxref.com/6.0.0_r1/xref/frameworks/base/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
从而Gallery可以访问MediaDocumentsProvider,而删除了照片的时候,一并将该权限删除了 MediaDocumentsProvider.onMediaStoreDelete(getContext(),
4069                                            volumeName, FileColumns.MEDIA_TYPE_IMAGE, id);,所以再次访问就报权限问题了
if (mediaType == FileColumns.MEDIA_TYPE_IMAGE) {
                                    deleteIfAllowed(uri, data);
                                    MediaDocumentsProvider.onMediaStoreDelete(getContext(),
                                            volumeName, FileColumns.MEDIA_TYPE_IMAGE, id);

                                    idvalue[0] = String.valueOf(id);
                                    database.mNumQueries++;
                                    Cursor cc = db.query("thumbnails", sDataOnlyColumn,
                                                "image_id=?", idvalue, null, null, null);
                                    try {
                                        while (cc.moveToNext()) {
                                            deleteIfAllowed(uri, cc.getString(0));
                                        }
                                        database.mNumDeletes++;
                                        db.delete("thumbnails", "image_id=?", idvalue);
                                    } finally {
                                        IoUtils.closeQuietly(cc);
                                    }
                                }

http://androidxref.com/6.0.0_r1/xref/packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java


revokeUriPermission删除权限
 /**
     * When deleting an item, we need to revoke any outstanding Uri grants.
     */
    static void onMediaStoreDelete(Context context, String volumeName, int type, long id) {
        if (!"external".equals(volumeName)) return;

        if (type == FileColumns.MEDIA_TYPE_IMAGE) {
            final Uri uri = DocumentsContract.buildDocumentUri(
                    AUTHORITY, getDocIdForIdent(TYPE_IMAGE, id));
            context.revokeUriPermission(uri, ~0);
        } else if (type == FileColumns.MEDIA_TYPE_VIDEO) {
            final Uri uri = DocumentsContract.buildDocumentUri(
                    AUTHORITY, getDocIdForIdent(TYPE_VIDEO, id));
            context.revokeUriPermission(uri, ~0);
        } else if (type == FileColumns.MEDIA_TYPE_AUDIO) {
            final Uri uri = DocumentsContract.buildDocumentUri(
                    AUTHORITY, getDocIdForIdent(TYPE_AUDIO, id));
            context.revokeUriPermission(uri, ~0);
        }
    }


http://androidxref.com/6.0.0_r1/xref/packages/providers/MediaProvider/src/com/android/providers/media/MediaDocumentsProvider.java
分享到:
评论

相关推荐

    解决java.lang.SecurityException: JCE cannot authenticate the provider BC问题

    在与银联的对接中,调试过程中报错或使用类似登入加密:java.lang.SecurityException: JCE cannot authenticate the provider BC 进行问题解决,里面包含 bcprov-jdk16-143.jar与bcprov-jdk15-135.jar与具体文件存放...

    jboss7.1.1下报java.lang.SecurityException: JCE cannot authenticate the provider BC

    标题中的“jboss7.1.1下报java.lang.SecurityException: JCE cannot authenticate the provider BC”是一个典型的Java安全异常,通常发生在尝试使用不受信任的加密提供者时。在这个问题中,"BC"指的是Bouncy Castle...

    反复重启无法进入桌面log

    Unable to create service com.android.systemui.keyguard.KeyguardService: java.lang.SecurityException: read wallpaper: Neither user 10044 nor current process has android.permission.READ_EXTERNAL_...

    Android Caused by: java.lang.ClassNotFoundException解决办法

    Android Caused by: java.lang.ClassNotFoundException解决办法 出现问题: 08-13 18:29:22.924: E/AndroidRuntime(1875): Caused by: Java.lang.ClassNotFoundException:XXXXX in loader dalvik.system....

    Android MediaProjection截屏&amp;录屏-适配Android

    Android Media...1、解决Android Q中java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION 异常 2、targetSdk 32可用

    bcprov加密库

    org.bouncycastle.openssl.PEMException: problem parsing ENCRYPTED PRIVATE KEY: java.lang.SecurityException: JCE cannot authenticate the provider BC at org.bouncycastle.openssl.PEMReader$...

    system.Security.SecurityException 不受信任

    标题 "system.Security.SecurityException 不受信任" 指的是在编程过程中遇到的一种特定错误,它属于 .NET Framework 的安全异常类型。此异常通常发生在代码尝试执行一个被安全策略禁止的操作时,例如访问受保护的...

    J2ee直接访问数据库步骤

    在J2EE(Java 2 Platform, Enterprise Edition)开发中,直接访问数据库通常是通过Java的JDBC(Java Database Connectivity)API来实现的。下面将详细解释J2EE直接访问数据库的步骤,以及涉及的相关知识点。 **步骤...

    JAVA常见异常解析,面试用

    - **java.lang.SecurityException**:在安全管理器存在且拒绝访问时抛出。 - **java.io.EOFException**:在输入流到达文件结尾时,尝试读取更多数据时抛出。 - **java.io.FileNotFoundException**:打开或创建指定的...

    深入研究java.lang.Runtime类.doc

    "深入研究java.lang.Runtime类" java.lang.Runtime 类是 Java 语言中一个非常重要的类,它提供了访问当前 Java 应用程序的 Runtime 环境的能力。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其...

    深入理解aidl&service;

    如果自己的service可以在别package中被引用,需要在manifest文件中把此service的android:exported属性设置为true,否则会导致引用时异常Android: java.lang.SecurityException: Permission Denial

    java异常详解

    - **`java.lang.SecurityException`**:当违反安全策略时抛出,例如试图访问受限资源。 - **`java.io.FileNotFoundException`**:当试图打开不存在的文件时抛出。 - **`java.lang.NegativeArraySizeException`**:当...

    commons-beanutils-1.7.0

    java.lang.SecurityException: class "org.apache.commons.collections.SequencedHashMap"'s signer information does not match signer information of other classes in the same package at java.lang....

    Java的异常类

    - **`java.lang.SecurityException`**:违反安全原则异常,例如尝试执行未授权的操作。 - **`java.io.EOFException`**:文件已结束异常。 - **`java.io.FileNotFoundException`**:文件未找到异常。 - **`java....

    常见异常处理方案

    9. **`java.lang.SecurityException`**: 安全管理器阻止了请求的操作。在执行敏感操作(如文件系统访问)时,需要确保有足够的权限。 10. **`java.io.IOException`**: 表示在输入/输出过程中发生了错误。在处理...

    SerialPort Android串口开发

    在AndroidManifest.xml中,添加`&lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;`和`&lt;uses-feature android:name="android.hardware.usb.host" /&gt;`权限,确保应用有权限访问串口。...

    Java异常大全

    - **`java.lang.SecurityException`**:当安全策略阻止执行某些操作时抛出。 - **`java.io.EOFException`**:当读取文件或流时达到文件末尾但数据还未完全读取完成时抛出。 - **`java.io.FileNotFoundException`**:...

    非intent发送邮件所需jar包

    在Android开发中,通常我们使用Intent来启动系统服务,例如发送邮件。然而,有些情况下,可能需要通过非Intent的方式发送邮件,比如在后台服务或无UI线程中处理。这时,我们就需要引入特定的JavaMail API库。"非...

    常见的java异常

    10. **java.security.SecurityException**:当安全策略阻止代码执行某些操作时,如访问敏感资源,会抛出此异常。理解并配置好安全策略以允许必要的操作。 对于每个异常,Java API文档提供了详细的描述和示例,帮助...

Global site tag (gtag.js) - Google Analytics