java.lang.SecurityException: Permission Denial

本文档详细记录了一个关于图库小部件显示所有图片时遇到的权限拒绝错误,该错误源于READ_EXTERNAL_STORAGE权限未被正确授予。通过修改WidgetTypeChooser类,引入Toast提示和权限检查,确保了在权限缺失时能正确通知用户并处理失败情况。

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

小部件然后添加图库,选择随机显示所有图片,然后图库里没有图片,会报下面的错误.

12-31 19:03:19.429 10483 10686 E DatabaseUtils: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=10650, uid=10033 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
12-31 19:03:19.429 10483 10686 E DatabaseUtils:     at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:637)
12-31 19:03:19.429 10483 10686 E DatabaseUtils:     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:505)
12-31 19:03:19.429 10483 10686 E DatabaseUtils:     at android.content.ContentProvider$Transport.query(ContentProvider.java:216)
12-31 19:03:19.429 10483 10686 E DatabaseUtils:     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:102)
12-31 19:03:19.429 10483 10686 E DatabaseUtils:     at android.os.Binder.execTransact(Binder.java:674)
12-31 19:03:19.437  3062  3107 I ActivityManager: Showing crash dialog for package org.codeaurora.gallery u0
 

 

 

解决办法:

--- a/packages/apps/SnapdragonGallery/src/com/android/gallery3d/gadget/WidgetTypeChooser.java
+++ b/packages/apps/SnapdragonGallery/src/com/android/gallery3d/gadget/WidgetTypeChooser.java
@@ -24,22 +24,37 @@ import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.RadioGroup;
 import android.widget.RadioGroup.OnCheckedChangeListener;
+import android.widget.Toast;
 
 import org.codeaurora.gallery.R;
 
-public class WidgetTypeChooser extends Activity {
+import com.android.gallery3d.app.AbstractPermissionActivity;
+
+public class WidgetTypeChooser extends AbstractPermissionActivity {
 
     private OnCheckedChangeListener mListener = new OnCheckedChangeListener() {
         @Override
         public void onCheckedChanged(RadioGroup group, int checkedId) {
-            Intent data = new Intent()
-                    .putExtra(WidgetConfigure.KEY_WIDGET_TYPE, checkedId);
+            Intent data = new Intent().putExtra(
+                    WidgetConfigure.KEY_WIDGET_TYPE, checkedId);
             setResult(RESULT_OK, data);
             finish();
         }
     };
+//added by fuying for 19291
+    @Override
+    protected void onGetPermissionsSuccess() {
+
+    }
 
     @Override
+    protected void onGetPermissionsFailure() {
+        Toast.makeText(this, R.string.get_accounts_denied, Toast.LENGTH_SHORT).show();
+        setResult(RESULT_CANCELED);
+        finish();
+    }
+//end
+    @Override

 

 

/*
 * Copyright (c) 2016, The Linux Foundation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *  * Neither the name of The Linux Foundation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.android.gallery3d.app;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import java.util.ArrayList;

public abstract class AbstractPermissionActivity extends FragmentActivity {

    public static final int PERMISSION_REQUEST_STORAGE = 1;
    private boolean permissionGranted = false;

    protected abstract void onGetPermissionsSuccess();
    protected abstract void onGetPermissionsFailure();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestStoragePermission();
    }

    private void requestStoragePermission() {
        String[] permissions = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE
        };
        requestPermission(permissions, PERMISSION_REQUEST_STORAGE);
    }

    protected void requestPermission(String[] permissions, int requestCode) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            permissionGranted = true;
            return;
        }

        boolean needRequest = false;
        ArrayList<String> permissionList = new ArrayList<String>();
        for (String permission : permissions) {
            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(permission);
                needRequest = true;
            }
        }

        if (needRequest) {
            int count = permissionList.size();
            if (count > 0) {
                String[] permissionArray = new String[count];
                for (int i = 0; i < count; i++) {
                    permissionArray[i] = permissionList.get(i);
                }

                requestPermissions(permissionArray, requestCode);
            }
        }
        permissionGranted = !needRequest;
    }

    private boolean checkPermissionGrantResults(int[] grantResults) {
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        permissionGranted = checkPermissionGrantResults(grantResults);
        switch (requestCode) {
            case PERMISSION_REQUEST_STORAGE: {
                if (permissionGranted) {
                    onGetPermissionsSuccess();
                } else {
                    onGetPermissionsFailure();
                }
            }
        }
    }

    protected boolean isPermissionGranted() {
        return permissionGranted;
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值