当前位置: 首页 > 知识库问答 >
问题:

安全异常:READ_EXTERNAL_STORAGE权限[重复]

焦兴为
2023-03-14

大家好!

我花了4个小时搜索堆栈溢出或视频如何修复错误: 由: java.lang.Security异常: 权限拒绝 [...] 需要android.permission.READ_EXTERNAL_STORAGE或 grantUriPermission()

 Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/35 from pid=15358, uid=10074 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

我尝试在我的应用程序中显示库中的图片。以下是清单:

<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".AddCountry" android:label="Add Country"></activity>
</application>

我尝试展示图片的活动

public class AddCountry extends AppCompatActivity implements Constant{

private ImageView imageView;
private Button btnUploadPhotos;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_country);
    initComponents();
}

private void initComponents() {
    imageView=(ImageView) findViewById(R.id.imgView_add_country_activity_uploadphotos);
    btnUploadPhotos=(Button)findViewById(R.id.btn_add_country_activity_uploadphotos);
    btnUploadPhotos.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            openGallery();
        }


    });

}

private void openGallery() {
    Intent gallery=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(gallery,ADD_COUNTRY_REQUEST_PICK_IMAGE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode==RESULT_OK&&requestCode==ADD_COUNTRY_REQUEST_PICK_IMAGE)
    {
        Uri imageUri=data.getData();
        String[] filePathColumn={MediaStore.Images.Media.DATA};
        Cursor cursor=getContentResolver().query(imageUri,filePathColumn,null,null,null);
        cursor.moveToFirst();

        int columnIndex=cursor.getColumnIndex(filePathColumn[0]);
        String picturePath=cursor.getString(columnIndex);
        cursor.close();

        Bitmap bitmap=BitmapFactory.decodeFile(picturePath);
        Drawable drawable=new BitmapDrawable(bitmap);
        imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
    }
}

首先,我尝试了这样的onActivityResult:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode==RESULT_OK&&requestCode==ADD_COUNTRY_REQUEST_PICK_IMAGE)
    {
        Uri imageUri=data.getData();
        imageView.setImageURI(imageUri);
    }
}

我没有出错,但是当我选择一个图像时,什么也没有发生。

应用程序捆绑包:

android {
compileSdkVersion 25
buildToolsVersion "25.0.1"
defaultConfig {
    applicationId "com.example.rares.proiect"
    minSdkVersion 16
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
}

更新

添加以下内容解决了问题:

如果 (检查自身权限(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

// Should we show an explanation?
if (shouldShowRequestPermissionRationale(
        Manifest.permission.READ_EXTERNAL_STORAGE)) {
    // Explain to the user why we need to read the contacts
}

requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
        MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

// MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
// app-defined int constant

return;

共有1个答案

华星文
2023-03-14

因为您的目标是sdk

 类似资料:
  • 问题内容: 我正在尝试访问用户设备上的媒体文件(音乐)以进行播放;一个简单的“ hello world”音乐播放器应用。 我遵循了一些教程,它们基本上给出了相同的代码。但这是行不通的。它不断崩溃,并告诉我: 现在,这是我的清单文件: 这是我的Java方法: 我试过了: 要将其放在清单文件中的不同位置: 要在读取外部存储权限下添加 要将其放在清单/应用程序/活动标签中: 将uri和cursro之间的

  • 要将其放在清单文件的不同位置: 要在读取外部存储前添加Android:maxsdkversion: 要将其放入manifest/application/activity-tag中: null 堆栈跟踪:

  • 我在elasticsearch插件中遇到了异常: java.security.AccessControlExcture:访问拒绝(org.elasticsearch.ThreadPersionorg.elasticsearch.ThreadPersion)java.security.AccessControlContext.check权限(AccessControlContext.java:472

  • 问题内容: 我正在尝试创建一个可以从Gallery应用程序获取图像并将其显示在imageButton上的简单应用程序。我正在运行Android 5.0.1的手机上使用API​​ 21进行测试。不幸的是,无论我尝试什么,即使我指定了权限,我仍然会遇到安全错误。 我获取图像的代码是: 当我尝试从Dropbox选择图像时,该代码有效,但是当我从图库中选择图像时,我得到 我将READ_EXTERNAL_S

  • 我正在尝试使用相机并保存图像。按照Commonware建议的步骤进行操作。我经常出错- 2018-11-12 02:10:54.588 3145-3173/inder.execE/Database aseUtils:写入异常到包裹inder.java:682安全异常:权限拒绝:写入android.support.v4.content.FileProvider uricontent://com.bi

  • 在创建服务器实例之前,你需要在该实例上添加安全组规则,这样服务器实例的用户才能ping这个主机或者通过SSH连接这个实例。安全组是IP过滤的规则组,它决定了网络的连通性,适用于一个Project内的所有实例。配置安全组有两种方式:要么是在默认的安全组中添加规则,要么新建一个安全组,然后把规则写在新的安全组里。 密钥对是SSH的证书,在实例启动时被注入进系统里。如欲使用密钥对注入,镜像中的系统上必须